OpenExpressApp:精通 WPF UI Virtualization

  • 时间:
  • 浏览:3
  • 来源:大发5分排列5_极速5分排列3

《WPF - Virtualizing an ItemsControl》:文中指出,ItemsControl 默认不支持 UI Virtualization,原困着是它的模板中没一个多 ScrollViewer。

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

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

    其中,为了实现在列表什么什么都那么数据时,显示 “什么什么都那么数据” 一个多字,使用了一个多 Grid 涵盖了一个多 ItemsPresenter 以及一个多 TextBlock。这段代码看上去什么什么都那么那此难题,就说 搞了愿意都什么什么都那么把 UIV 调试出来,最终还会 不需要 在网上耐心学习了很我 UIV 的相关知识。

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

有什么什么都那么有哪几个:

《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》。

人太好,在解决之前 看来,难题主要出在 TreeGrid 的 Template 上,直接贴上来给我们歌词 我们歌词 儿看看:

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

相关资源

     人太好,

更高级的自定义 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》。

难题

    先来看看实现 UIV 前:

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

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

    就说 ,上端的 xaml 主要一个多 错误:

来看看优化后的结果:

解决方案

之前 系统中用到的 DataGrid 控件,一旦数据被分组之前 ,性能异常低下。原困着人太好也和 UIV 有关:

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

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

    最近对 OEA 的 TreeGrid 控件进行了比较大的改造,并使用新的控件来替换了系统中所有的 DataGrid 控件。新的 TreeGrid 控件实现了就说 新的功能,(之前 会写一篇文章说明),愿意最后遗留了一个多 难题:机会使用它替换了曾经的 DataGrid,而 DataGrid 默认是支持 UI Virtualization 的,当就说 界面的数据量比较大时,什么什么都那么支持 UIV 的TreeGrid 控件就显得就说 力不从心了。为了解决这种难题,这四天看过就说 文章并学习了 WPF 中 UIV 的知识,在最后终于解决了,待写下此文予以记录。

目前 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 文章如下:

大功告成!

MS 当事人的相关资源:

修改为以下 xaml 即可: