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

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

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

  实现的基本原理:

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

  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;
        }

这也是我在IT在线教育平台麦子学院学习时做的一篇笔记,这里整理一下,希望能抛砖引玉。

Windows Phone 7 ListBox 列表项渐显加载动画学习笔记的更多相关文章

  1. 【转】未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。

    “/xxxxx”应用程序中的服务器错误. ------------------------------------------------------------------------------- ...

  2. 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

    [源码下载] 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互 作者: ...

  3. 【转发】未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。

     http://www.cnblogs.com/joey0210/archive/2012/09/29/2708420.html   上一篇文章说到了DLL引用问题,主要是说的程序中如果使用过了反射, ...

  4. 微信小程序开发——列表分页上拉加载封装实现(订单列表为例,订单状态改变后刷新列表滚动位置不变)

    业务需求: 业务需求是给订单列表添加分页功能,也就是上拉加载这种每次只请求加载固定数量的数据. 需求分析: 对业务来说就是简单的分页上拉加载,但是对于技术实现来说,除了要处理分页数据的累加加载,还要处 ...

  5. 引用64位dll时候出现 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。试图加载格式不正确的程序。

    引用64位dll时候出现 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序. 需要在web.config增加配置 <startup use ...

  6. System.BadImageFormatException : 未能加载文件或程序集“Medici.PaymentRecover, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。

    System.BadImageFormatException : 未能加载文件或程序集“xxxxx.xxxxx, Version=1.0.0.0, Culture=neutral, PublicKey ...

  7. 重新想象 Windows 8 Store Apps (54) - 绑定: 增量方式加载数据

    [源码下载] 重新想象 Windows 8 Store Apps (54) - 绑定: 增量方式加载数据 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 绑定 通过实 ...

  8. 未能加载文件或程序集“XXXXX”或它的某一个依赖项。试图加载格式不正确的程序。

    未能加载文件或程序集“FastColoredTextBox, Version=2.10.5.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项.试图加载 ...

  9. 能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。试图加载格式不正确的程序。

    现象: 能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序.

随机推荐

  1. OS X 10.9 Mavericks 安装 thrift 0.9.1

    通过Homebrew安装的时候,编译会报错.查了一下资料,原来是10.9系统默认使用的libc++的库,而且移除了C++ 11标准前tr库,所以编译存在问题.且笔者使用的时候,brew安装只支持到0. ...

  2. ubuntu 11.10 安装apache2 tomcat6

    ubuntu 11.10 安装apache2 tomcat6 导读 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目 ...

  3. uva 12096 The SetStack Computer

    点击打开链接uva 12096 思路: STL模拟 分析: 1 题目给定5种操作,每次输出栈顶集合的元素的个数 2 利用stack和set来模拟,set保存集合的元素.遇到push的时候直接在stac ...

  4. android studio无法更新之解决方案

    当发现android studio有更新时,当然第一时间就想更新,可惜被墙了. 解决方案: 下载wallproxy,百度你懂的 在proxy.ini中最上面,找到ip和port 接着,在android ...

  5. The Socket API, Part 5: SCTP

    转:http://www.linuxforu.com/2011/12/socket-api-part-5-sctp/ By Pankaj Tanwar on December 29, 2011 in  ...

  6. 让Laravel5支持memcache的方法

    Laravel5框架在Cache和Session中不支持Memcache,看清了是Memcache而不是Memcached哦,MemCached是支持的但是这个扩展真的是装的蛋疼,只有修改部分源码让其 ...

  7. LeetCode33 Search in Rotated Sorted Array

    题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7  ...

  8. c#winform将全局异常抛出,不用大量写try()catch()

    一.在program.cs处完善成如下,但是这样后只能抛出主线程(UI)的错误,所以请看第二步 /// 应用程序的主入口点. /// </summary> [STAThread] stat ...

  9. [Java] 转:多线程 (并发)总结

    一概念 二创建多线程方法 三线程常用方法不完整可以自己查阅JDK文档 四线程的生命周期与转换 五同步 六竞争者消费者 七线程池 八JDK 线程工具 线程基础: 1. 创建 2. 状态切换 3. sle ...

  10. Liunx下全局安装 Composer

    我把它放在系统的PATH目录中,这样就能在全局访问它. curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/l ...