WPF Virtualization
WPF虚拟化技术分为UI 虚拟化和数据虚拟化
第一种方法被称为"UI 虚拟化"。支持虚拟化用户界面的控件是足够聪明来创建只显示的是实际在屏幕上可见的数据项目所需的 UI 元素。例如,假设我们有一个滚动的列表框是绑定到 1,000,000 项目的数据,但在任何时候是可见的只有 100。没有 UI 虚拟化,列表框将创建 100 万 ListBoxItems — — 一个缓慢的过程 — — 并包括他们在 UI 中,即使只有一百人是可见。与用户界面虚拟化,另一方面,列表框中将只创建 100 ListBoxItems (或更多,从而提高滚动性能)。
第二种方法,被称为"虚拟化的数据,"更进了一步。使用数据虚拟化的控件不会加载到内存的所有数据项。相反,它只加载显示所需的。在我们上面的列表框示例,使用数据的虚拟化解决方案将只保留约 100 个数据项目在内存中在任何给定时间。
VirtualizingStackPanel.IsVirtualizing 附加属性
VirtualizingStackPanel.VirtualizationMode 附加属性
<StackPanel> <StackPanel.Resources>
<src:LotsOfItems x:Key="data"/>
</StackPanel.Resources> <ListBox Height="" ItemsSource="{StaticResource data}"
VirtualizingStackPanel.VirtualizationMode="Recycling" /> </StackPanel>
容器回收
.NET 3.5 SP1 支持 UI 容器的重用已经在内存中。例如,想象当加载一个列表框,则 30 ListBoxItems 创建要显示的可见数据。当用户滚动列表框,而不是丢弃滚动到视图之外的 ListBoxItems 和创建新的数据项的滚动到视图,WPF 会重用现有的 ListBoxItems。此结果中显著的性能改进与以前的版本相比,因为它减少了的时间花了初始化 ListBoxItems。因为垃圾回收不是瞬时的它也减少了 ListBoxItems 存储器中的数一次。
您可以启用容器回收通过在您的控件上设置附加的属性"VirtualizingStackPanel.VirtualizationMode"到"Recycling":
<ListBox ScrollViewer.IsDeferredScrollingEnabled="True" … />
为了保持向后兼容与早期版本的行为,容器回收的默认被禁用的 (默认的 VirtualizationMode 是"Standard")。作为一个经验法则,我建议将此属性设置每次创建一个控件,需要滚动以显示数据的项目。
延迟滚动
"递延滚动"是一种功能,允许用户拖动滚动条滑块周围而无需更改显示的项,直到滚动条滑块被释放。这提高了应用程序的感知的响应滚动时显示的项使用复杂的模板,但当然,用户不能看到他们在滚动的项目。
与.NET 3.5 SP1 中,它有可能启用延迟滚动通过在控件上设置附加的属性:
<ListBox ScrollViewer.IsDeferredScrollingEnabled="True" … />
分层数据
在.NET 3.5 SP1 中,WPF 团队扩展用户界面虚拟化到 TreeView 通过向 VirtualizingStackPanel 添加对分层数据的支持。因此,容器回收和上面讨论的递延滚动功能也适用于分层数据。默认情况下,在 TreeView 中禁用用户界面虚拟化 — — 在这里是如何启用它:
<TreeView VirtualizingStackPanel.IsVirtualizing="True" …
这个属性是非常有用的不只是为树视图,但对于任何控件的使用 VirtualizingStackPanel 和那不设置 IsVirtualizing 为 true (例如 ItemsControl)。列表框中已经将 IsVirtualizing 设置为 True,默认情况下,这样就无需显式设置它。
局限性
.NET 3.5 SP1 固定很多以前的限制在 UI 虚拟化,但仍然是一对夫妇仍然:
- ScrollViewer 目前允许两种滚动模式: 平滑滚动的像素 (CanContentScroll = false) 或离散按项目滚动 (CanContentScroll = true)。目前 WPF 支持用户界面虚拟化,只有当按项目滚动。基于像素的滚动也被称为"物理滚动"和基于项目的滚动也被称为"逻辑滚动"。
- 使用数据绑定"分组"功能时,那里是没有用户界面虚拟化的支持。
这些真的是相同的限制。如果你看看默认的样式列表框、 列表视图和组合框,你会发现下面的触发器:
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</Trigger>
分组执行假定每个组是一个单独的项目中包含它的 ItemsControl。因为每个组可以 (并且通常所做的) 有很多子项目,按项目滚动将结果真的不好的用户体验 — — 滚动下来有点会导致一大跳下一组的顶部。这就是为什么团队决定切换到基于像素滚动显示分组数据时。不幸的后果是没有用户界面虚拟化支持的分组时。
WPF Virtualization的更多相关文章
- [WPF]WPF Data Virtualization和UI Virtualization
这篇博客将介绍WPF中的虚拟化技术. 1. Data Virtualization 通常情况下我们说数据虚拟化是指数据源没有完全加载,仅加载当前需要显示的数据呈现给用户.这种场景会让我们想到数据分页显 ...
- 精通 WPF UI Virtualization (提升 OEA 框架中 TreeGrid 控件的性能)
原文:精通 WPF UI Virtualization (提升 OEA 框架中 TreeGrid 控件的性能) 本篇博客主要说明如何使用 UI Virtualization(以下简称为 UIV) 来提 ...
- OpenExpressApp:精通 WPF UI Virtualization
原文:OpenExpressApp:精通 WPF UI Virtualization 本篇博客主要说明如何使用 UI Virtualization(以下简称为 UIV) 来提升 OEA 框架中 Tre ...
- [WPF系列]-基础系列 TabControl应用
引言 Tabcontrol控件也是我们在项目中经常用到的一个控件,用它将相关的信息组织在一起分类显示. 简介 ========================================= ...
- wpf DataGrid CheckBox列全选
最近在wpf项目中遇到当DataGrid的header中的checkbox选中,让该列的checkbox全选问题,为了不让程序员写自己的一堆事件,现写了一个自己的自定义控件 在DataGrid的 &l ...
- wpf 如果列表加载超多数据变的卡顿时,使用VirtualizingStackPanel
如果列表加载超多数据变的卡顿时 <ListBox > <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Virt ...
- WPF相关资料集锦
微软官方资料 .NET Framework源代码 https://referencesource.microsoft.com/ 微软官方文档 https://docs.microsoft.com/en ...
- wpf datagrid performance
http://stackoverflow.com/questions/1704512/wpf-toolkit-datagrid-scrolling-performance-problems-why h ...
- 关于WPF你应该知道的2000件事
原文 关于WPF你应该知道的2000件事 以下列出了迄今为止为WPF博客所知的2,000件事所创建的所有帖子. 帖子总数= 1,201 动画 #7 - 基于属性的动画 #686 - 使用动画制作图像脉 ...
随机推荐
- sql 查看表结构
sqlserver 查看表结构 exec sp_help @TableName --得到表信息.字段,索引.constraint. exec sp_pkeys @TableName --得到主键. e ...
- idea2016 64位 安装,jdk环境变量配置
idea 激活服务器地址: 地址1: http://www.iteblog.com/idea/key.php 地址2: http://idea.qinxi1992.cn/ intelli ...
- 关于JAVA中的回调接口传值机制
详见博文http://blog.csdn.net/xiaanming/article/details/8703708
- 9、scala函数式编程-集合操作
一.集合操作1 1.Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的 ...
- Entity Framework Code-First(3):Setup Environment
Setup Development Environment for EF Code-First: Let's setup the development environment for Code-Fi ...
- html span
提示:请使用 <span> 来组合行内元素,以便通过样式来格式化它们.注释:span 没有固定的格式表现.当对它应用样式时,它才会产生视觉上的变化.以上是w3上的标准解释,另外span是个 ...
- 简单Hadoop集群环境搭建
最近大数据课程需要我们熟悉分布式环境,每组分配了四台服务器,正好熟悉一下hadoop相关的操作. 注:以下带有(master)字样为只需在master机器进行,(ALL)则表示需要在所有master和 ...
- UML——再回首
概述 在画图的过程中,发现自己还是有好多不懂的地方,对于四大关系理解的不是特别透彻,所以画图的过程中总是"剪不断,理还乱!"再一次整理四大关系,再回首必然丰收~~~ 1.实 ...
- 未能加载文件或程序集“Oracle.DataAccess, Version=4.112.2.0, Culture=neutral, PublicKeyTok”
1.首先看一下C:\Windows\assembly目录下是不是只有一个Oracle.DataAccess,我的版本是10,如果是只有一个,则往下看: 2.将完整的odp.net(目录下包含注册文件) ...
- 深入理解Java虚拟机 学习总结
一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区 1.1 程序计数器 程 ...