Virtualizing an ItemsControl?

19 浏览
0 Comments

Virtualizing an ItemsControl?

我有一个包含数据列表的ItemsControl,我希望对其进行虚拟化,但是将 VirtualizingStackPanel.IsVirtualizing=\"True\" 设置为真似乎对 ItemsControl 不起作用。

这是真的吗?还是有其他我不知道的方法?

为了测试,我使用了以下代码块:

    
        
    


如果我将 ItemsControl 更改为 ListBox,我可以看到 Initialized 事件只运行了几次(巨大的边距只是为了只有少量记录),但作为 ItemsControl,每个项都得到了初始化。

我尝试将 ItemsControlPanelTemplate 设置为 VirtualizingStackPanel,但似乎也没有帮助。

admin 更改状态以发布 2023年5月21日
0
0 Comments

在DavidN的答案的基础上,这里有一种样式可用于ItemsControl实现虚拟化:



我不喜欢使用ListBox,因为它们允许选择你不需要的行。

0
0 Comments

实际上,让ItemsPanelTemplate使用VirtualizingStackPanel要做的事情比这要多得多。默认的ItemsControl控件模板没有ScrollViewer,而这是实现虚拟化的关键。添加到ItemsControl的默认控件模板(使用ListBox的控件模板作为模板)得到以下结果:


  
    
      
    
  
  
    
      
    
  
  
    
      
        
          
        
      
    
  

(顺便说一下,一个查看默认控件模板的好工具是Show Me The Template

需要注意的事项:

你必须设置ScrollViewer.CanContentScroll="True",请看这里为什么。

还要注意我添加了VirtualizingStackPanel.VirtualizationMode="Recycling"。这将减少TextBlock_Initialized被调用的次数,只调用 TextBlocks 可见在屏幕上的次数。你可以在这里阅读更多关于UI虚拟化的内容。

编辑:忘记说明一个显而易见的解决方案了:你可以用ListBox替换ItemsControl :)(没有ScrollViewer.CanContentScroll="True"时)

还要注意这个Optimizing Performance on MSDN pageItemsControl不在“实现性能特性的控件”表中,这就是为什么我们需要编辑控件模板的原因。

0