最近在项目里面碰到最头疼的一个难题就是Listbox虚拟化的问题,查阅很多文档其实Listbox本身是支持虚拟化的,那么在什么情况下会破坏Listbox的虚拟化呢?目前我接触到的主要有两个原因:一.是需要在Listbox的ItemTemplate模板里面承载更多的显示内容,因此我们将不再使用默认显示模板(VirtualizingStackPanel),比如我们需要在Listbox每一项里面包含一张图片同时下面显示一行说明文字,遇到这种情况,我们可能会这样去定义Listbox的模板项:

由于StackPanel容器控件本身是不支持虚拟化的,因此这就会间接地破坏Listbox的虚拟化。还有一种就是有的时候我们需要实现下拉刷新的效果,由于Listbox本身是没有提供那种刷新的效果的,所以我们往往会根据Listbox里面拉动的距离来计算是否拉动到底部或者顶部,因此我们需要重写一个继承自Listbox的用户自定控件,但是当我们运用用户自定义控件的时候,我们测试发现这种情况下也已经破坏了Listbox的虚拟化,那么是为什么呢?按道理我们的自定义控件是从Listbox集成而来,可是为什么却没有Listbox默认的虚拟化效果呢?本人自己推测如下,因为有的时候我们去实现VirtualizingStackPanel模板属性,即使有的时候会想到去实现,但是实现的方式可能又跟系统提供的有出入(这块不太严谨,本人没有自测)。

那么有没有什么好的办法可以避免以上原因所带来的Listbox虚拟化破坏呢?在网上找了好久,发现好多人都采用LongListSelector控件去代替Listbox控件,没错LongListSelector默认情况下也是支持虚拟化的,并且即使改变它的内部默认模板,它的虚拟化也是不会被破坏的,但是在实际的运用当中本人还遇到一个比较头疼的问题,就是:LongListSelector要显示的内容是从Web上面下载而来的时候,我们会遇到一个异常:

Layout cycle detected. Layout could not complete.

这到底是什么原因引起的呢?大体意思是:界面检测的时候,没有完成。可是为什么重新检测界面呢?网上找了一些资料发现:原来进行Web请求的时候,会有一定的时间延迟。在数据返回到客户端得到处理之前,LongListSelector里面的Image控件已经得到初始化了,当真正的网络回来之后,客户端需要重新去处理数据,这个时候得到的真正的数据(例如图片),他们的大小可能是不相同,LongListSelector要展示他们就需要重新给计算控件大小,分配合适的空间大小,这个时候就会一起上面我们说到的异常。那么有没有什么好的办法去处理这种异常呢?网上好多人的处理方法是:固定Image空间的大小,给它设置固定的Height和Width,但是本人试了一下,貌似还是不可以的。针对这块本人还没有找到什么好的解决方案,如果读者有什么高见的话,欢迎与我联系。

Windows Phone Listbox虚拟化的问题的更多相关文章

  1. windows phone listbox虚拟化(下)

    之前写过一篇关于listbox虚拟化的文章,那里采用的方法都是自己早期研究的一些思路,然后发现当数据很大的时候,其实性能效果还是不太理想,下面让我们来仔细想一想到底是基于什么原因,我们回去破坏默认的虚 ...

  2. Windows phone UI虚拟化和数据虚拟化(二)

    书接上回的Windows phone UI虚拟化和数据虚拟化(一)我们学习了wp的ui虚拟化.今天来和大家分享一下wp的数据虚拟化. 并同时感谢我的同事dgwutao在编写此文时给我的巨大帮助,3ks ...

  3. Windows phone UI虚拟化和数据虚拟化(一)

    今天和大家分享一些关于windows phone ui虚拟化和数据虚拟化的一些知识. 也顺便回答我上一篇[LongListSelector 控件 在 wp7 和wp8中的不同之处]里,留下的那个问题, ...

  4. Windows Server 2012 虚拟化实战:网络(二)

    关于Windows Server的虚拟化网络,前文描述了在操作系统层面上的出现的配置变化.其中的一些配置通过Windows Server提供的小工具即可实现,如网卡组的配置,而有些需要安装Window ...

  5. Windows Server 2012 虚拟化实战:存储(二)

    五.搭建Window Server 2012虚拟化的存储网络 前文我们讨论了Window Server 2012支持的各种与存储相关的技术,接下来我们通过实践对其中的一些技术进行检验.实际上Windo ...

  6. Windows Server 2012 虚拟化实战:存储(一)

    在计算机世界我们随处可以见的一种方法,那就是抽象.1946年冯诺依曼提出了计算机的基本结构包含:计算器,存储器和I/O设备.这可能是对计算机这一新生事物最重要的一次抽象,它直接影响了今后几十年计算机软 ...

  7. Windows Server 2012 虚拟化实战:SCVMM的安装和部署

    本篇大概介绍一下在Windows Server 2012 R2上安装和部署SCVMM的过程及其注意事项.下图是我们数据中心SCVMM的基本架构,其中 SCVMM Database 是用于存储了所有配置 ...

  8. Windows Server 2012 虚拟化实战:网络(一)

    虚拟化对于计算的抽象,大家可能相对熟悉,也许都有在单机使用诸如Virtual PC或者Virtual Box的经验.使用的这些虚拟化软件的第一印象就是我们的CPU可以同时运行多套不同的操作系统,并且其 ...

  9. Windows Server 2012 虚拟化实战:域

    在Windows Server系统中,一些服务必需要构建在域的环境中,这不仅是为了统一验证和资源共享,同时也是为了网络安全.为构建虚拟化测试,我们需要先搭建域环境.之前先来大概了解一下域. 在使用工作 ...

随机推荐

  1. AX2012全新的批处理方式

    AX2009 的批处理操作我们是通过RunBaseBatch framework,我们所要做的事情就是继承RunBaseBatch class,实现里面该实现的方法来执行批处理. AX2012 的批处 ...

  2. AX 利用windows粘贴板功能实现批量数据快速导出EXCEL

    static void test(Args _args) { int lineNum; int titleLines; SysExcelApplication excel; SysExcelWorkb ...

  3. ios开发之OC基础-类和对象

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  4. VC++2010下编译STLport,Boost

    VC++2010下编译STLport,Boost 最近在想向Boost转移,努力掌握Boost代码的过程中, STLport版本:5.2.1 Boost版本:1.4.6.1 (1.4.7.0也OK) ...

  5. Oracle 通过触发器 来创建 同步临时表 及处理 通过 自治事务 来解决 查询 基表的问题

    // 触发器 create or replace trigger tr_sync_BD_MARBASCLASS after INSERT or UPDATE on BD_MARBASCLASS for ...

  6. hbase基本结构

    HBASE  基本结构一.overview1. hbase <=> NOSQL     不错,hbase 就是某种类型的nosql 数据库,唯一的区别就是他支持海量的数据.    hbas ...

  7. 1.3查看Linux内核版本

    1.目前Linux内核主要维护的三个版本:Linux2.4.Linux2.6和Linux3.x,Android使用的是Linux2.6:Linux3.x是最新推出的Linux内核版本: 2.查看Lin ...

  8. activiti搭建(三)整合Modeler

    转载请注明源地址:http://www.cnblogs.com/lighten/p/5878169.html 接上一章,activiti工作流引擎虽然运行了起来,但是什么都没有.activiti官方在 ...

  9. html5 canvas画板

    点击查看演示地址 <!DOCTYPE HTML> <html> <title>HTML5-CanvasDrawDemo</title> <meta ...

  10. Linux下vi编辑器粘贴复制剪切功能

    RedHat 9.0 Linux下vi编辑器实现简单的粘贴复制剪切功能": 如果想把文件内的第三行内容黏贴到第十五行: 1.进入你的文件,(处于命令模式,而不是编辑模式) 2.将你的光标移到 ...