在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. QT核心编程之Qt线程 (c)

    QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类 ...

  2. global $GLOBALS区别

    <?phpfunction &test(){     static $b=0;//申明一个静态变量     $b=$b+1;     echo $b;     return $b; }} ...

  3. AlloyTouch实现下拉刷新

    原文地址:https://github.com/AlloyTeam/AlloyTouch/wiki/Pull-to-refresh 效果展示 扫码体验 你也可以点击这里访问Demo 可以点击这里查看代 ...

  4. 被淡忘的c#析构函数

    析构函数在C#中已经很少使用了,以至于很多人已经把它淡忘了,虽然用处不大,研究一下也无防.(原文:http://bbs.csdn.net/topics/300178463)一. 析构函数的特征:析构函 ...

  5. 非常详细的 Docker 学习笔记

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...

  6. nginx +lua +redis 构建自动缓存系统

    一. nginx环境搭建 第一步下载 LuaJIT-2.0.4.tar.gz http://luajit.org/download/LuaJIT-2.0.4.tar.gz安装 make &&a ...

  7. MVC+jquery+AJAX的几种方式

    // 传过去一个简单值,获取一个简单值 $.ajax({ type: "GET", url: '<%= Url.Action("xx", "Co ...

  8. 【Android 界面效果23】LayoutInflater作用及使用

    作用:  1.对于一个没有被载入或者想要动态载入的界面, 都需要使用inflate来载入. 2.对于一个已经载入的Activity, 就可以使用实现了这个Activiyt的的findViewById方 ...

  9. Java Scoket编程

    Java Scoket编程 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位, ...

  10. 各种"居中"

    先看效果 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> < ...