欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-04-30 19:28:00
在wp7程序中,当程序功能越来越复杂时,性能问题是我们不得不考虑的一个问题。在聊天列表中,如果聊天项过多,而且项目ui足够复杂时, 我们不得不想尽办法让ui尽快加载。所以有一种可行的方案,就是像qq...

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


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


 

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

(www.weibo.com/codewp7)
 
 
请猛击http://www.codewp7.com/forum.php?mod=viewthread&tid=589&extra=
摘自  yewenpeng