当前位置: 首页 > news >正文

(仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...

在wp7程序中,当程序功能越来越复杂时,性能问题是我们不得不考虑的一个问题。在聊天列表中,如果聊天项过多,而且项目UI组件足够复杂时,

我们不得不想尽办法让UI尽快加载。所以有一种可行的方案,就是像QQ聊天列表一样,从上至下,列表项逐一加载(加载完第一项,再加载第二项,再加载第三项,给用户尽快的UI响应,也不至于等待到显示所有的列表项。

在我们的例子中,我还给每个列表项显示的过程中加入了渐显动画,这样当列表项足够复杂时,也能表现出比较好的展示效果。

 

在这里我不得不感谢一直支持我的卤面网版主,是他让我提起兴趣写了这么一篇文章,再次感谢卤面网,一个非常不错的wp7开发论坛,后面我也将再次向大家发布几篇高质量文章,请大家到卤面上找我吧,呵呵

    进入正题:

实现的基本原理:

     实现的原理也不难,主要的思路是:

    1.列表项原本只是一个简单的自定义ContentControl(Codewp7ItemContainer),等到合适的时机再加载他的content(Codewp7ListBoxItem);

    2.使用一个管理类LoadService,对UI列表项的加载进行控制,当加载了一项后,再进行第二项的加载,再进行第三项的加载....。

    3.给每一个实际的列表项的显示加入渐显动画。

开始看我们的实现吧:

ListItemObject: 列表的实际数据

 public class ListItemObject
{
public string Title;
public string Info;
}

LoadService的队列控制实现

    RoutedEventHandler itemLoaded;
List<UILoadAction> LoadItems = new List<UILoadAction>();
object LoadArrayLock = new object();

//当UILoad队列中 全部UI load成功,会回调这个函数
public event RoutedEventHandler LoadedComplete;

public void PushLoadAction(UILoadAction loadAction)
{

if (loadAction == null)
return;
lock (LoadArrayLock)
{
LoadItems.Add(loadAction);
}
if (LoadItems.Count <= 1)
{
PopLoadAction();
}
}
private void PopLoadAction()
{
if (LoadItems.Count <= 0)
{
// Log.d(TAG, "LoadedComplete!");
if (LoadedComplete != null)
{
LoadedComplete(null, null);
}
return;
}

mEle.Dispatcher.BeginInvoke(() =>
{
lock (LoadArrayLock)
{
UILoadAction action;
if (LoadItems.Count <= 0)
{
// Log.d(TAG, "LoadedComplete in BeginInvoke!");
if (LoadedComplete != null)
{
LoadedComplete(null, null);
}
return;
}
// Log.d(TAG, "LoadAction Array size:"+LoadItems.Count);
action = LoadItems[0];
action(item_Loaded);
// Log.d(TAG, "pop");
LoadItems.RemoveAt(0);
}
});
}


void item_Loaded(object sender, RoutedEventArgs e)
{
PopLoadAction();
}

对于每一项加入渐显动画

 private Storyboard getLoadStoryBoard()
{
Storyboard ret;
// Prepare for scale animation
double from = 0;
double to = 1;

TimeSpan timespan = TimeSpan.FromSeconds(0.8);
IEasingFunction easingFunction = new ExponentialEase { EasingMode = EasingMode.EaseInOut };
ret = new Storyboard();



DoubleAnimation animationOpacity = new DoubleAnimation { From = from, To = to, Duration = timespan, EasingFunction = easingFunction };
Storyboard.SetTarget(animationOpacity, this);
Storyboard.SetTargetProperty(animationOpacity, new PropertyPath(UIElement.OpacityProperty));
ret.Children.Add(animationOpacity);



return ret;
}

 有朋友反应,当加载200多项时,进入页面,再退出 ,再进入,可能就没办法加载了,

这里的确有这么一个bug,可以通过在页面退出时,将LoadService中的列表进行清空进行解决,谢谢大家反馈



我希望你能喜欢我的文章!如果你有更多想法,请到卤面网 wp7开发论坛(codewp7.com)问答区联系我,我会很高兴知道你在想什么。同时wp7交流QQ群172765887中,也能找到我的身影,感谢大家,也欢迎大家关注我的微薄(www.weibo.com/codewp7)


源码请猛击

转载于:https://www.cnblogs.com/sonyye/archive/2012/03/11/2389694.html

相关文章:

  • TCP编程
  • 在线客服 qq,msn,skype, outlook 链接
  • 惠普前CEO卡莉讲演:千万不要贩卖你的灵魂(转载)
  • .net中应用SQL缓存(实例使用)
  • js函数集合大全
  • 用vs命令提示符来使用 Installutil.exe来安装和卸载Windows服务
  • 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现按部门组织机构设置权限...
  • [转载]最简单的.NET生成随机数
  • 用原生JS进行CSS格式化和压缩
  • EXT.NET高效开发(四)——实用技巧
  • js 基础
  • 免费空间域名,简易免费安装百科网站教程!!!
  • 函数的弹性设计
  • 常见100个管理学定律
  • flexigrid
  • hexo+github搭建个人博客
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • express + mock 让前后台并行开发
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript 基础知识 - 入门篇(一)
  • Object.assign方法不能实现深复制
  • PHP 7 修改了什么呢 -- 2
  • spring security oauth2 password授权模式
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • use Google search engine
  • 排序算法之--选择排序
  • 优化 Vue 项目编译文件大小
  • ​Spring Boot 分片上传文件
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #pragma pack(1)
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (3)nginx 配置(nginx.conf)
  • (4.10~4.16)
  • (day6) 319. 灯泡开关
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Core 成都线下面基会拉开序幕
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .Net IOC框架入门之一 Unity
  • .Net Web窗口页属性
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .Net转前端开发-启航篇,如何定制博客园主题
  • /var/log/cvslog 太大
  • [@Controller]4 详解@ModelAttribute
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [20171106]配置客户端连接注意.txt
  • [ActionScript][AS3]小小笔记
  • [AIGC 大数据基础]hive浅谈
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [C]编译和预处理详解
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [CTO札记]如何测试用户接受度?