何为ItemControl?

是指包含一个项集合,如datagrid,listbox,tabControl,treeview.

那UI Virtualization又是什么呢?

最开始看到这个概念是在bea stollnitz的blog上,其实我也不知道该如何界定,但是一个控件如果支持ui virtualization(虚拟化),

那么它只会创建需要被显示在屏幕实际可见部分的的ui 元素。可能这还不是很明白,假设我有一个带滚动条的ListBox,绑定到ListBox上的数据有10000条,

而ListBox的高度只能够显示100条数据,由于在silverlight3中ListBox支持(UI Virtualization)虚拟化,所以实际上ListBox只会创建100条ListItem,

而不是实际绑定的10000条  ,如果将ListBox的UI虚拟化功能禁用掉,那么ListBox将会创建10000条ListItem,或者有100000条或更多,性能会怎样呢?因此,

某种程度上讲,UI虚拟化是可以解决大数据集合性能的,

当然要完全解决大数据集合绑定ItemControls的性能问题,仅仅依靠UI虚拟化是不够的,因为还需要运用另外的一种技术Data Virtualization(数据虚拟化).

1.ItemControl怎样实现UI 虚拟化?

wpf很早就已经支持UI虚拟化了,但是在silverlight中,直到3才开始,ItemControls才默认支持UI虚拟化,在silverlight3中所有的ItemControls都是

通过VirtualizingStackPanel来实现虚拟化.默认情况下, VirtualizingStackPanel将为每个可见项创建一个项容器(ItemContainer),并在不再

需要时(比如当项滚动到视图之外时)丢弃该容器。当 ItemsControl 包含多个项时,创建和丢弃项容器的过程可能会对性能产生负面影响。如果

VirtualizationMode 设置为 Recycling,VirtualizingStackPanel 将重用项容器,而不是每次创建新的项容器。 如果 将VirtualizingStackPanel

的VirtualizationMode 设置为Standerd,那么VirtualizingStackPanel将无法回收项容器,它将使用标准虚拟化模式,即为每个项创建和丢弃项容器。

详细情况见msdn 的介绍irtualizingStackPanel,VirtualizationMode .

还是以ListBox作为例子吧,假设我有一个带滚动条的ListBox,绑定到ListBox上

的数据有10000条,而ListBox的高度只能够显示100条数据ListBox将会使用VirtualizingStackPanel作为他们的项容器,在假如当前我们看到ListBox

现实的数据是第1-100条,如果ListBox是这样设置的<ListBox VirtualizingStackPanel.VirtualizationMode="Recycling" … />,那么当我拖动滚动条,

让其显示第101-200数据,那么此时ListBox不是回收之前创建的第1-100个项容器,再重新创建100个项容器来显示第101-200条数据,而是重复利用

已经创建的项容器,也就是刚开始为现实第1-100条数据而创建的项容器。但是如果我将<ListBox VirtualizingStackPanel.VirtualizationMode="Standerd" … />

这样设置,这时候VirtualizingStackPanel就如同普通的Panel,当需要滚动显示其他数据,那么就不会重复利用项容器了.在silverlight3中所有的ItemControl

的VirtualizingStackPanel.VirtualizationMode默认值都是Recycling.除非显式的指明VirtualizationMode为standerd,才会关闭UI虚拟化。

2.那么ItemControl实现UI虚拟化,会有什么问题吗?

既然我这么问,答案是绝对肯定的,直到周五我也才完全弄明白问题的原因就是由于UI虚拟化。我在siverlight forum看到也有人提出诸如此类的问题

Datagrid: Scrollbar size not changing correctly when data added to the grid,当然这个只是问题中的一种,在我的silverlight项目中,有2个场景出现问题:

A.当向一个带滚动条的ListBox,添加新数据后,有时在屏幕上会看不到刚添加的那条数据,而实际上数据已经成功加入,

情况类似Datagrid: Scrollbar size not changing correctly when data added  to the grid,这个帖子下面一些朋友提到的办法,

比如在保存成功之后调用itemcontrol的UpdateLayout()方法.不过经过长时间的测试,

我发现一个规律就是只有当ListBox的中的数据超过ListBox高度的时候(需要拖动scrollBar来查看所有数据),这个现象才会出现。同里在删除ListBox中的数据也是,

数据库里没有了,但界面上依然存在。我曾用很极端的方式来解决问题,就是删除数据成功后,我找到被删除的对象,然后删除其对应的ListItem,而不是重新取数据绑定到ListBox。

B.这个问题则更让我头疼了,还是贴2张图,这是我项目中一个关于对象属性的画面,属性包括5种类型,文本,数字,日期,单选,多选,需要根据属性类型不同而显示不同的编辑方式。

图1上的文字和按钮出现重叠,原本button和checkBox都该是隐藏的,本来保存按钮只有当编辑过属性值,才会出现的,看到的图2是正常的画面,

当然图2的正常仅限于没有拖动滚动条,当拖动滚动条后图2中的内容,就是图1的效果了.至于图3由于其属性类型是简单的文本,日期,数字无论怎样拖动都不会出现问题。

虽然这个项目是由我一个人在做,但是我还是和其它同事有讨论过原因,都认为问题应该是处在多选项(ListBox)高度计算上,由于多选项的选项值不确定,

导致ListBox的高度计算上除了差错,从而导致在重绘UI元素是出现了偏差,而解决的办法是自己手动计算ListBox的高度,同事给出的结论几乎可以说这个问题无解

图1                                                                                         图2

图3

不过当我真正理解ListBox的UI虚拟化,似乎上面2个问题就迎刃而解了.当我尝试着将图1中显示最外层显示的Listbox显式VirtualizingStackPanel.

VirtualizationMode="Standerd",无论我如果拖动滚动条,图1的画面都不会出现。为什么出现这个问题?

我的解释是:

1. 对于问题A,就是当由于  不是每次让新添加的数据都显示在列表的最前端(业务需要),所以当滚动条出现后,新添加的那条数据不会出现在ListBox的可见范围内,

由于ui虚拟化就使得ListBox不会为该条数据创建用于显示的项容器,对于为什么觉得是有时能立即看到,我想大概是由于滚动条的位置有关,

不过禁用Listbox的虚拟化功能,问题也就随之解决了。

2. 对于问题B,当ListBox虚拟化开启当,如果所有属性均为简单的文本,数字,日期类型,

单选,其项容器的高度都是一个单位(一行),因此当拖动滚动条,无论属性类型,及内容如何改变,项容器高度都仍然是一个单位,自然不会出现重叠,

但是当属性类型为多选项的时候或都是多选项的时候,由于每个属性的多选项数目不一,导致项容器的高度不一致。如果拖动滚动条,重复利用项容器的时候,

无论当前的多选项选项数目多余或少于滚动之前的,都将出现项容器高度与当前多选项实际显示高度不一致的情况,即会出现重叠现象。所以解决的办法就是

禁用Listbox的虚拟化功能,让其每次滚动之后都回收之前的项容器,创建新的项容器,当然这样会损失写性能,所以还需要运用Data virtualization,这里就不多说了。

最后在这里请教一个问题,也是一个非常让我头疼的问题:在silverlight中上传大文件(当然是使用wcf service),在上传过程中,我将文件以256k为一块,

不停的调用service,直到文件传输完毕,当然这个过程使用到了事务,现在已经能正常使用,但是有一个问题就是如果我强制将ie窗口关闭(即强制取消上传)

那样整个wcf service就不能访问,除非重启服务,我猜想原因可能是由于事务造成的,由于强制取消,导致事务既没有完成,也没有回滚,处于一种挂起状态,

不过我奇怪的是为什么无法访问服务,更不知道该如何解决这一问题,希望有人能给点提示。在这里先谢过了!

转载于:https://www.cnblogs.com/jhxk/articles/2286057.html

silverlight3:(ItemControl 的)UI Virtualization相关推荐

  1. 精通 WPF UI Virtualization

    本篇博客主要说明如何使用 UI Virtualization(以下简称为 UIV) 来提升 OEA 框架中 TreeGrid 控件的性能,同时,给出了一些学习 UIV 的资源. 问题 最近对 OEA ...

  2. [WPF]WPF Data Virtualization和UI Virtualization

    这篇博客将介绍WPF中的虚拟化技术. 1. Data Virtualization 通常情况下我们说数据虚拟化是指数据源没有完全加载,仅加载当前需要显示的数据呈现给用户.这种场景会让我们想到数据分页显 ...

  3. 精通 WPF UI Virtualization (提升 OEA 框架中 TreeGrid 控件的性能)

    精通 WPF UI Virtualization (提升 OEA 框架中 TreeGrid 控件的性能) 原文:精通 WPF UI Virtualization (提升 OEA 框架中 TreeGri ...

  4. HTML5 Web app开发工具Kendo UI Web中Grid网格控件的使用

    Kendo UI Web中的Grid控件不仅可以显示数据,并对数据提供了丰富的支持,包括分页.排序.分组.选择等,同时还有着大量的配置选项.使用Kendo DataSource组件,可以绑定到本地的J ...

  5. UWP Composition API - GroupListView(一)

    需求: 光看标题大家肯定不知道是什么东西,先上效果图: 这不就是ListView的Group效果吗?? 看上去是的.但是请听完需求. 1.Group中的集合需要支持增量加载ISupportIncrem ...

  6. OEA 中 WPF 树型表格虚拟化设计方案

    最近用 OEA 做的仓库管理系统中,许多界面的都需要使用表格控件来显示数据.一是这些表格的列非常多,有的甚至达到了 200 列,而且一个模块的界面中可能同时显示好几个表格.这导致界面的速度比较慢,特别 ...

  7. UWP Composition API - GroupListView(二)

    还是先上效果图: 看完了上一篇UWP Composition API - GroupListView(一)的童鞋会问,这不是跟上一篇一样的吗??? 骗点击的?? No,No,其实相对上一个有更简单粗暴 ...

  8. Scrum大白话总结

    原文地址:http://www.cnblogs.com/zgynhqf/archive/2010/03/25/1695426.html Scrum是敏捷过程中比较著名的一个过程框架,被很多团队采用. ...

  9. Gist in GitHub

    转载:http://nonocast.cn/gist-in-github/ 其中的gist只是比git多个s,但两者并没有什么关系,gist中文翻译为要领.要旨.gist是github所提供的一种类似 ...

最新文章

  1. 传输层端口号的范围是多少?被分为哪两部分_Cu2ZnSnS4纳米晶做空穴传输层经配体改性将低温可喷涂碳电极基钙钛矿太阳能电池的性能提高到17.71...
  2. iOS集成alipay无线应用sdk错误问题
  3. Android --- BaseQuickAdapter 子控件设置了addOnClickListener(R.id.xxx);点击的时候还是没反应
  4. Oracle日期函数集锦
  5. 合工大python期末复习知识点汇总
  6. C语言内存泄露很严重,如何应对?
  7. java死锁怎么用jvm调试_性能测试之JVM的故障排查-死锁
  8. stringstream 使用方法
  9. 64位程序怎么判断指针是否有效_和微信大佬聊了一夜,他告诉我为什么指针被誉为 C 语言灵魂?...
  10. iptable 简析
  11. Ubuntu18.04为EW-7822ULC网卡安装驱动
  12. Python框架django路由管理
  13. Unity 制作小地图
  14. 记一次物理服务器磁盘故障修复过程
  15. 纯CSS实现弹幕效果
  16. [乐意黎原创] 关于eMule下载伤硬盘的话题
  17. 微信小程序 实现打卡功能
  18. ZYNQ Vivado address editor
  19. 计算智能——遗传算法的多维函数优化
  20. 【算法基础】经典例题说递归

热门文章

  1. 制药企业BI系统方案整体设计分享
  2. 计算机应用 格式,《计算机应用》投稿格式.pdf
  3. python 命令行参数_Python 命令行参数介绍
  4. mysql怎么换行_MySql的主从复制、主主复制
  5. python吃香吗_python编程为何这么吃香
  6. python第三方库安装(复习)
  7. Vue,简洁方式开发web,仅添加vue.js文件,不使用全家桶
  8. 控制台没有消息循环_【干货】思科设备报错消息汇总大全~
  9. 三元组法矩阵加法java_C语言实现矩阵加法、减法、乘法和数乘运算
  10. c++ ftp服务端_重磅干货||五万字长文总结:C/C++ 知识(下篇)