参考链接

《WPF编程宝典》
《深入浅出WPF》

简述

  1. 在处理大型 Children 集合时,请考虑使用 VirtualizingStackPanel 而不是常规的 StackPanel

通过虚拟化子集合,VirtualizingStackPanel 仅在内存中保留当前位于父级视区内的对象。 因此,在大多数情况下,性能得到显著提高。

与StackPanel的区别

  1. 在处理大型 Children 集合时,请考虑使用 VirtualizingStackPanel 而不是常规的 StackPanel

通过虚拟化子集合,VirtualizingStackPanel 仅在内存中保留当前位于父级视区内的对象。 因此,在大多数情况下,性能得到显著提高。

实践

官方示例

WPF 还提供 StackPanel 元素的一个变体,用于自动“虚拟化”数据绑定子级内容。 在此上下文中,“虚拟化”一词指的是一种技术:通过此技术根据屏幕上哪些项可见,从较多的数据项中生成一个元素子集。 如果在指定时刻只有少量 UI 元素位于屏幕上,则此时生成大量 UI 元素需要占用大量内存和处理器。 VirtualizingStackPanel(通过 VirtualizingPanel 提供的功能)计算可见项,并与来自 ItemsControl(如 ListBoxListView)的 ItemContainerGenerator 配合使用,以便仅为可见项创建元素。
VirtualizingStackPanel 元素自动设置为 ListBox 等控件的项宿主。 在承载数据绑定集合时,只要内容在 ScrollViewer 的边界内,内容就将自动虚拟化。 在承载许多子项时,这将大幅提高性能。
以下标记演示如何使用 VirtualizingStackPanel 作为项宿主。 VirtualizingStackPanel.IsVirtualizingProperty 附加属性必须设置为 true(默认值)才能进行虚拟化。

  1. <StackPanel DataContext="{Binding Source={StaticResource Leagues}}">
  2. <TextBlock Text="{Binding XPath=@name}" FontFamily="Arial" FontSize="18" Foreground="Black"/>
  3. <ListBox VirtualizingStackPanel.IsVirtualizing="True"
  4. ItemsSource="{Binding XPath=Team}"
  5. ItemTemplate="{DynamicResource NameDataStyle}"/>
  6. </StackPanel>

个人实践