最近在项目里面碰到最头疼的一个难题就是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. unknown software exception

    打开cmd 输入下面代码,回车,等跑完即解决for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1

  2. 安装office2013时弹出microsoft setup bootstrapper已停止工作,接着就不能安装了

    只是说一下自己的解决方法: 我的原因是注册表没有删除改进. 1.输入regedit 2.找到HKEY_LOCAL_MACHINE\software\microsoft\windows\CurrentV ...

  3. [转]回答--python django学的很迷茫怎么办?

    作者:王一链接:http://www.zhihu.com/question/26235428/answer/36568428来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处 ...

  4. Linux:两台服务器之间添加信任关系,进行远程操作的时候不需要输入密码

    两台机器之间建立信任关系的步骤: 1. 在机器1上root用户执行ssh-keygen命令,生成建立安全信任关系的证书,直接Enter [root@CentOS64-x64 ~]# ssh-keyge ...

  5. 0329 复利计算器5.0 Juint单元测试 组员 254列志华 253韩麒麟

    一.主要功能与需求分析 1.本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 2.如果按照单 ...

  6. Android IOS WebRTC 音视频开发总结(二八)-- 多人视频方案介绍

    很多人问视频会议,在线教学,主播怎么弄,所以整理下这方面的开源解决方案, 同时为了方便测试,在自己服务器上搭建了相应的服务端,文章来自博客园RTC.Blacker,转载请说明出处. 简单来说,WEBR ...

  7. Android IOS WebRTC 音视频开发总结(十九)-- kurento

    折腾了一个多星期终于将kurento的环境搭建好(开发阶段的产品,有些BUG要自己解决),所以单独写篇文件来介绍. 下面开始介绍kurento,文章来自博客园RTC.Blacker,转载请说明出处. ...

  8. 华为OJ—火车进站(栈,字典排序)

    http://career-oj.huawei.com/exam/ShowSolution?method=SolutionApp&id=2282 给定一个正整数N代表火车数量,0<N&l ...

  9. 运行ipython后显示WARNING: IPython History requires SQLite, your history will not be saved

    在CentOS6.5下将自带的python2.6升级到python2.7,并安装了ipython,启动ipython后显示如下信息: WARNING: IPython History requires ...

  10. ChainOfResponsibility

    #include <iostream> using namespace std; class Chain { public: bool Handle() { return false; } ...