2010-11-22 72 views
5

如果TreeView设置如下,什么能阻止TreeView虚拟化?WPF:TreeView虚拟化不起作用

<TreeView 
    ItemsSource="{Binding}" 
    VirtualizingStackPanel.IsVirtualizing="True"> 
    <TreeView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
     </ItemsPanelTemplate> 
    </TreeView.ItemsPanel> 
    <TreeView.ItemContainerStyle> 
     <Style 
      TargetType="{x:Type TreeViewItem}"> 
      <Setter 
       Property="IsExpanded" 
       Value="{Binding IsExpanded, Mode=TwoWay}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

我有一个未虚拟化,当我展开节点(并使用窥探检查)我所有的TreeViewItems的创建。我想知道是否有一些阻止TreeView虚拟化其内容的容器组合。 (例如,在一个StackPanel中托管它)

+0

本文可能对虚拟化定制有所帮助:http://stackoverflow.com/questions/126230/resources-and-guides-to-ui-virtualization-in-wpf – Domokun 2010-11-25 00:28:55

回答

5

问题在于样式。经过一番研究,我们发现有一种针对TreeView的未命名风格(即DataType={x:Type TreeView}没有x:Key),另一个针对我们的App.xaml(或同等版本)中的TreeViewItem。它分别覆盖了ControlTemplate

这些样式没有触发器将ItemsPanel设置为VirtualizingStackPanel,并且没有提及任何虚拟化。当样式被删除时,TreeView工作正常。即使本地属性在TreeView上设置了ItemsPanelVirtualizingStackPanel.Isvirtualizing="True",这些属性也没有被传播到TreeViewItems,因此TreeView的顶层将虚拟化,而子类别不会(因为它们的虚拟化行为取决于TreeViewItem