首页 新闻 会员 周边 捐助

Windows Phone中ListBox绑定来自隔离存储图片时的性能问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-12-24 10:57

有大约1000张或者更多的图片存在隔离存储区,图片大小每张大概在60k左右,通过数据绑定的方式在Listbox中显示,载入数据的时候已经进行了数据虚拟化处理(参考这篇文章),部分代码如下:

  public object this[int index]
        {
            get
            {
                Model model = null;
                model = new Model
                {
                    Img = GetImage(),
                    Text = "Test" + index,
                    Index = index
                };
                return model;
            }
            set
            {
                throw new NotImplementedException();
            }
        }

  ImageSource GetImage()
        {
            ImageSource img = null;
            using (var isofile = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (var isoStream = isofile.OpenFile("2.jpg", FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    if (isoStream != null)
                    {
                        img = PictureDecoder.DecodeJpeg(isoStream);
                    }
                    isoStream.Dispose();
                }
                isofile.Dispose();
            }
            return img;
        }

我做过实验,在载入1000张左右的图片时,大概会有2~4秒左右的时间停留在等待页面。加载的时候能平滑滚动,只是由于ListBox的默认虚拟化处理,当快速滑动时,每次读取图片,都要进行一次Io操作,大家都懂的,一片空白。

而现在网上能找到的解决方案大多数都是建议使用off-thread方式处理,但那主要针对网络图片的,因为Mango后的Image控件特别针对网络片做了改进,添加了一个异步下载完成的通知处理。而对于隔离存储区的图片,每取一次都要进行一次IO操作,当图片数目过多时,肯定会悲剧的。

我也尝试过将数据源属性设置为BitmapImage(当前为ImageSource),设置创建方式为Backgroud,但大家都懂的,BitmapImage的Setsource方法是异步的,效果还没有当前的好,当我循坏调用加载方法时(与代码段中德SetImage方法类似),有时候图片根本没加载完成,就跳到下一次循环,结果不言而喻,还是悲剧!

最近有看了下Windows Blog上的这篇文章,或者这篇翻译版,文章很长,总结起来无非就是这么几个方面:

  1. 精简ListBoxItem的数据模版(当前位一个横向的Stackpanel,里面有一个Image控件和一个Textblock控件)
  2. 使用值转换器(这么多图片,杀了我吧)
  3. 前面说过的off-thread方式(可UriSource是Uri啊)
  4. 根据滚动条的位置,分页加载,数据虚拟化和分段加载应该差不多吧?(这里不是很明白)

小弟如今已经黔驴技穷了,所以在此请教给位同行及前辈,还望不吝赐教,小弟先行谢过各位了!

吹牛的啤酒的主页 吹牛的啤酒 | 初学一级 | 园豆:199
提问于:2012-12-03 10:16
< >
分享
最佳答案
0

换了种方法实现了

吹牛的啤酒 | 初学一级 |园豆:199 | 2012-12-24 10:56
其他回答(1)
0

请问楼主是怎么实现的呢?希望能楼主能分享一下经验,谢谢。

流浪的虫子 | 园豆:202 (菜鸟二级) | 2013-05-16 18:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册