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 - 使用动画制作图像脉 ...
随机推荐
- Ubuntu 切换root用户是时出现su Authentication failure
su root 时出现错误su Authentication failure 原因是没有给root用户设置密码 sudo passwd root
- Spring入门第二十四课
Spring对JDBC的支持 直接看代码: db.properties jdbc.user=root jdbc.password=logan123 jdbc.driverClass=com.mysql ...
- C++ STL 的各结构实现
C++ STL 的实现: 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque 底层数据结构为一个中央控制器和多个缓 ...
- C#----接口与抽象类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 接口 { ...
- 微信小程序自学第五课:条件渲染、列表渲染
一.条件渲染 1. wx:if 在框架中,我们用 wx:if="{{condition}}" 来判断是否需要渲染该代码块: <view wx:if="{{condi ...
- Ubuntu 安装 samba 实现文件共享和source insight 阅读uboot
环境:win10 + 虚拟机Ubuntu 12.04 一. samba的安装: # sudo apt-get install samba # sudo apt-get install smbfs 二. ...
- jquery事件之事件处理函数
一.事件处理 方法名 说明 语法 (events 事件类型,data数据,handler 事件处理函数,selector 选择器) Bind( 为每一个匹配元素的特定事件(像click)绑定一个事件处 ...
- c++常考算法知识点汇总
前言:写这篇博客完全是给自己当做笔记用的,考虑到自己的c++基础不是很踏实,只在大一学了一学期,c++的面向对象等更深的知识也一直没去学.就是想当遇到一些比较小的知识,切不值得用一整篇 博客去记述的时 ...
- Educational Codeforces Round 53C(二分,思维|构造)
#include<bits/stdc++.h>using namespace std;const int N=1e6+6;int x[N],y[N];int sx,sy,n;char s[ ...
- 使用HTTP协议访问网络(Android)
在做项目的过程中需要连接服务器访问数据,还没有接触过Android网络编程方面,参考了<Android第一行代码>,在做的过程中遇到了很多的问题,这里就此记录一下. 先给出访问网络的代码: ...