• Windows Phone Listbox虚拟化的问题


          最近在项目里面碰到最头疼的一个难题就是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,但是本人试了一下,貌似还是不可以的。针对这块本人还没有找到什么好的解决方案,如果读者有什么高见的话,欢迎与我联系。

       

  • 相关阅读:
    jqgard改变单元格后重新定值(事件和弹窗)
    js多个input框赋相同值
    查看PHP已安装拓展的指令
    PHP重新安装zlib拓展,处理PHP Startup: Invalid library (maybe not a PHP library) 'zlib.so' in Unknown
    php拓展安装报错:PHP Startup: Invalid library (maybe not a PHP library) 'zlib.so' in Unknown
    Composer提示:Installation Failed, Reverting ./Composer.Json To Its Original Content.错误的解决办法
    SQL Server序列号的获取
    一步步开发Windows服务(Windows Service)[转]
    HTML+CSS+JS实现的贪吃球小游戏【转】
    自制一个滚动条
  • 原文地址:https://www.cnblogs.com/xiaocai20091687/p/VirtualizingStackPanel.html
Copyright © 2020-2023  润新知