有大约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上的这篇文章,或者这篇翻译版,文章很长,总结起来无非就是这么几个方面:
小弟如今已经黔驴技穷了,所以在此请教给位同行及前辈,还望不吝赐教,小弟先行谢过各位了!
换了种方法实现了
请问楼主是怎么实现的呢?希望能楼主能分享一下经验,谢谢。