博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows Phone 7 ListBox 列表项渐显加载动画学习笔记
阅读量:5044 次
发布时间:2019-06-12

本文共 2302 字,大约阅读时间需要 7 分钟。

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

 

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

转载于:https://www.cnblogs.com/maiziedu/p/4022515.html

你可能感兴趣的文章
51NOD 1432 独木舟(贪心
查看>>
0033-数字和星期转换
查看>>
hdoj1024【DP.最 大 m 字 段 和】(写完我都怕。。。不忍直视。。)
查看>>
POJ1182【种类并查集】
查看>>
使用Linux的命令行工具做简单的文本分析
查看>>
远程调试ASP .NET和Silverlight
查看>>
线程的概念
查看>>
360极速模式(Chrome内核)下由ashx输出的JavaScript代码不起作用
查看>>
Ubuntu 开机启动是出现 grub rescue 解决办法
查看>>
python 2.4 的字符串转时间(日期减法取间隔时间)
查看>>
2017.3.9下午
查看>>
centos彻底删除文件夹、文件命令
查看>>
期末作品
查看>>
DevExpress XtraGrid网格控件示例五:验证终端用户输入的数据
查看>>
读书笔记week1——涂涵越
查看>>
Java成语接龙
查看>>
邮件中的商务英语
查看>>
win 7 IIS 配置
查看>>
2017年4月20日
查看>>
linux命令:read
查看>>