WPF VirtualizingPanel 实现UI虚拟化

当需要优化ItemsControl的性能时,使用VirtualizingPanel 。

优点是不会为面板的所有子元素创建相应的 UI 元素,而只会为显示的那些子元素创建相应的 UI 元素。

尤其是元素多的情况下,这会导致性能上的巨大差异。

VirtualizingPanel类中实现以下几项依赖属性。

  1. CacheLength/CacheLengthUnit
  2. IsContainerVirtualizable
  3. IsVirtualizing
  4. IsVirtualizingWhenGrouping
  5. ScrollUnit
  6. 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(容器被重复使用)仍然可用。

posted @ 2023-11-08 23:43  平常xin  阅读(292)  评论(0编辑  收藏  举报