参考链接
《WPF编程宝典》
《深入浅出WPF》
简述
- 在处理大型 Children 集合时,请考虑使用 VirtualizingStackPanel 而不是常规的 StackPanel。
通过虚拟化子集合,VirtualizingStackPanel 仅在内存中保留当前位于父级视区内的对象。 因此,在大多数情况下,性能得到显著提高。
与StackPanel的区别
- 在处理大型 Children 集合时,请考虑使用 VirtualizingStackPanel 而不是常规的 StackPanel。
通过虚拟化子集合,VirtualizingStackPanel 仅在内存中保留当前位于父级视区内的对象。 因此,在大多数情况下,性能得到显著提高。
实践
官方示例
WPF 还提供 StackPanel 元素的一个变体,用于自动“虚拟化”数据绑定子级内容。 在此上下文中,“虚拟化”一词指的是一种技术:通过此技术根据屏幕上哪些项可见,从较多的数据项中生成一个元素子集。 如果在指定时刻只有少量 UI 元素位于屏幕上,则此时生成大量 UI 元素需要占用大量内存和处理器。 VirtualizingStackPanel(通过 VirtualizingPanel 提供的功能)计算可见项,并与来自 ItemsControl(如 ListBox 或 ListView)的 ItemContainerGenerator 配合使用,以便仅为可见项创建元素。
VirtualizingStackPanel 元素自动设置为 ListBox 等控件的项宿主。 在承载数据绑定集合时,只要内容在 ScrollViewer 的边界内,内容就将自动虚拟化。 在承载许多子项时,这将大幅提高性能。
以下标记演示如何使用 VirtualizingStackPanel 作为项宿主。 VirtualizingStackPanel.IsVirtualizingProperty 附加属性必须设置为 true(默认值)才能进行虚拟化。
<StackPanel DataContext="{Binding Source={StaticResource Leagues}}"><TextBlock Text="{Binding XPath=@name}" FontFamily="Arial" FontSize="18" Foreground="Black"/><ListBox VirtualizingStackPanel.IsVirtualizing="True"ItemsSource="{Binding XPath=Team}"ItemTemplate="{DynamicResource NameDataStyle}"/></StackPanel>
