OpenExpressApp:精通 WPF UI Virtualization

  • 时间:
  • 浏览:0

大功告成!

《WPF - Virtualizing an ItemsControl》:文中指出,ItemsControl 默认不支持 UI Virtualization,原因分析是它的模板中非要假如有一天 ScrollViewer。

Visuals 的数量由 1W8 降到了 100,当行数更多时,也就保持初始生成 100 个左右。拖动起来也明显地感觉到流畅了你你这一。

     其实,

更高级的自定义 UI Virtualization,还可不上能先参考以下几篇文章,很不错:《Virtualizing WrapPanel》、《Implementing a virtualized panel in WPF (Avalon)》、《IScrollInfo in Avalon part I》、《IScrollInfo in Avalon part II》、《IScrollInfo in Avalon part III》。

相关资源

《Are there any tricks that will help me improve TreeView’s performance》:你你这一 系列的文章一共3篇:《Part I》、《Part II》、《Part III》, 最后一篇说明了在如可使用 ListBox 模拟假如有一天 TreeView,假如有一天 ,将会 ListBox 五种支持 UIVirtualization,全都最后的 “TreeView” 也就支持了 UI Virtualization。同类的控件将会有人传到了 CodeProject 上:《Virtualizing Tree View (VTreeView)》,其中还正好谈到了上面的这系列文章,非常凑巧的是,它还谈到了 CodeProject上被有人儿儿系统选取来实现 TreeGrid 控件的资源:《A Versatile TreeView for WPF》。

一同,注意打开 TreeView 的 UIV 支持:

    先来看看实现 UIV 前:

《WPF DataGrid Virtualization with Grouping》、《MSDN Sample Code:Grouping and Virtualization》、《Problem: ListView Virtualization》

间题

一篇通俗易懂的 UIV 概念文章:《UI Virtualization》,其中讲到了 WPF 及 SilverLight 中的 UIV。(它还有后续的文章:《Data virtualization》,也很不错)。

518 条数据,生成了 181100 个 Visuals。

来看看优化后的结果:

MS 当事人的相关资源:

    全都,上面的 xaml 主要有假如有一天错误:

    最近对 OEA 的 TreeGrid 控件进行了比较大的改造,并使用新的控件来替换了系统中所有的 DataGrid 控件。新的 TreeGrid 控件实现了全都新的功能,(之一定会写一篇文章说明),如可让最后遗留了假如有一天间题:将会使用它替换了假如有一天 的 DataGrid,而 DataGrid 默认是支持 UI Virtualization 的,当你你这一界面的数据量比较大时,非要支持 UIV 的TreeGrid 控件就显得你你这一力不从心了。为了处里你你这一 间题,这多日 看多你你这一文章并学习了 WPF 中 UIV 的知识,在最后终于处里了,待写下此文予以记录。

其实,在处里但是看来,间题主要出在 TreeGrid 的 Template 上,直接贴上来给有人儿儿看看:

目前 WPF 中的控件在 Group 分组后是不支持 UI Virtualization 的,原因分析是当 ScrollViewer.CanContentScroll 设置为 true 时,模式由 Scroll By Pixel 变为 Scroll by Item。而分组后的控件中每假如有一天组 GroupItem 其实假如有一天假如有一天 Item,这时,将会继续使用 Scroll by Item 模式,将会得到非常差的用户体验,全都 MS 决定不支持分组后的 UIV,ListBox 控件的默认模板蕴藏假如有一天 Trigger 当 IsGrouping 为 True 时,设置 ConContentScroll 为 False。相关的内容参见:《UI Virtualization》。其它与分组相关的 UIV 文章如下:

修改为以下 xaml 即可:

    本篇博客主要说明如可使用 UI Virtualization(以下简称为 UIV) 来提升 OEA 框架中 TreeGrid 控件的性能,一同,给出了你你这一学习 UIV 的资源。

《Virtualizing TreeViewItem》: 其中的最佳答案说到哪几个知识点:VirtualizingStackPanel 还要和 ScrollViewer 进行交互,一同,它只支持一层的 Virtualization。还可不上能考虑变通地使用 ListBox/ListView 来实现假的 TreeView,假如有一天 就还可不上能实现整个列表的虚拟化。

有非要哪几个:

《MSDN Control Performance》、《How to: Find a TreeViewItem in a TreeView》(如可在 UIV 的情况下找到控件)、《Changing selection in a virtualized TreeView》

处里方案

    其中,为了实现在列表非要数据时,显示 “非要数据” 八个字,使用了假如有一天 Grid 蕴藏了假如有一天 ItemsPresenter 以及假如有一天 TextBlock。这段代码看上去没哪些间题,全都搞了但是 都非要把 UIV 调试出来,最终非要在网上耐心学习了很我 UIV 的相关知识。

但是系统中用到的 DataGrid 控件,一旦数据被分组但是,性能异常低下。原因分析其实也和 UIV 有关: