WPF VirtualizingPanel 实现UI虚拟化
当需要优化ItemsControl的性能时,使用VirtualizingPanel 。
优点是不会为面板的所有子元素创建相应的 UI 元素,而只会为显示的那些子元素创建相应的 UI 元素。
尤其是元素多的情况下,这会导致性能上的巨大差异。
VirtualizingPanel类中实现以下几项依赖属性。
- CacheLength/CacheLengthUnit
- IsContainerVirtualizable
- IsVirtualizing
- IsVirtualizingWhenGrouping
- ScrollUnit
- VirtualizationMode
CacheLength、CacheLengthUnit、IsContainerVirtualizable、IsVirtualizingWhenGrouping和ScrollUnit实际上是新的功能。
VirtualizingPanel - 简介
VirtualizingPanel从一开始就存在于 WPF 中。这提供了不必立即为可视化创建ItemsControl的所有 UI 元素的可能性。这会消耗宝贵的资源(CPU、内存),并且如果条目很多,可能需要更长时间。相反,只创建了一部分元素 - 那些实际显示的元素。
我们来看看对比耗时:
CacheLength/CacheLengthUnit
从 WPF 4.5 开始,可以创建当前未显示的元素的缓存。为此,可以通过CacheLengthUnit 设置缓存单元。可能的有:
- Item
- Page
- Pixel
此设置影响CacheLength。这现在确定了视口之前和之后的缓存大小(这是可见区域)。这样可以避免 UI 元素只在可见时才生成(这当然会对用户体验产生负面影响)。
<ListBox ItemsSource="{Binding VirtualizedBooks}" ItemTemplate="{StaticResource BookTemplate}" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.CacheLength="1,2" VirtualizingPanel.CacheLengthUnit="Page"/>
IsContainerVirtualizable
可以为单个项目指定它们是否应该由VirtualizingPanel 虚拟化。默认情况下,设置值为true。
是虚拟化
到目前为止,此方法仅可用于派生类VirtualizingStackPanel(通过附加属性)。它现在也可用作VirtualizingPanel类的附加属性。
集群数据的虚拟化
在分组数据的情况下,虚拟化迄今已丢失。默认情况下仍然是这种情况,但可以通过IsVirtualizingWhenGrouping进行更改。
滚动单元
到现在为止,列表的元素总是完全显示和滚动。使用ScrollUnit现在可以配置行为。项目和像素作为选项提供。
<ListBox ItemsSource= "{Binding VirtualizedBooks}" temTemplate= "{StaticResource BookTemplate}" VirtualizingPanel.ScrollUnit= "Pixel" />
除了滚动的不同之外,在下面的屏幕截图中还可以看到另一个:
由于只有一个元素被滚动,因此可能存在空闲区域。这可以通过将ScrollUnit设置为值 Pixel 来避免,因为这也允许显示截断的元素。
虚拟化模式
到目前为止,此方法仅可用于派生类VirtualizingStackPanel(通过附加属性)。它现在也可用作VirtualizingPanel类的附加属性。可能的设置没有任何变化。值Standard(容器被创建并再次丢弃)和Recycling(容器被重复使用)仍然可用。