WPF中的虚拟化

  1. WPF中的虚拟化技术是一种能够提升界面性能的一种技术,尤其是对一些展示大量数据的控件有用(如 ListBox、ListView、ItemsControl)
  2. 虚拟化的原理比较简单:

    只创建并渲染当前可见区域中的元素,对于那些未出现在视口中的项,不创建 UI 元素,也不参与布局和渲染,从而减少内存消耗和提高性能。

  3. 虚拟化通常依赖 VirtualizingStackPanel 来实现。默认情况下,像 ListBoxListView 使用的 ItemsPanel VirtualizingStackPanel(垂直排列)。这一点在你自己重写的控件的Template的时候会发现,如同下面这样:
    1 <ListBox ItemsSource="{Binding LargeData}">
    2     <ListBox.ItemsPanel>
    3         <ItemsPanelTemplate>
    4             <VirtualizingStackPanel/>
    5         </ItemsPanelTemplate>
    6     </ListBox.ItemsPanel>
    7 </ListBox>

    当用户滚动时,VirtualizingStackPanel 会根据滚动偏移判断哪些项应显示,只为这些项创建 Container(通常是 ListBoxItemListViewItem)。

  4. 一般情况下虚拟化是默认开启的,除非你手动设置了ScrollViewer.CanContentScroll="False"或者是VirtualizingStackPanel.IsVirtualizing="False"; 

  5. 虚拟化默认开启的前提是:

    • 使用了ItemsControl(如 ListBox
    • 使用了VirtualizingStackPanel(wpf中唯一你能使用的虚拟化面板,你可以通过继承VirtualizingPanel来实现其他排列方式的虚拟化面板
    • 滚动由 ScrollViewer 控制(内置或外部)
    • CanContentScroll="True"
    • 不使用复杂布局(如 WrapPanelGrid),如果你的项是自定义的用户控件,那么你需要关注虚拟化可能无效的问题。

 

6.ScrollViewer.CanContentScroll,这个属性为False的时候表示关闭逻辑滚动,VirtualizingStackPanel.IsVirtualizing="False"表示关闭虚拟化的功能。

 

7.如果你是使用原生控件,并且对效率有更高的要求,你可以手动指定虚拟化的模式 VirtualizingStackPanel.VirtualizationMode="Recycling",当你设置模式为Recycling,wpf除了给你生成显示区域的元素之外,还会重用已经滑出视野的元素容器。这样会使你的程序内存和效率都更佳。

posted @ 2025-07-12 23:35  Yanaha  阅读(121)  评论(0)    收藏  举报