2010-11-22 75 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