2010-11-22 21 views
5

Co może powstrzymać TreeView przed wirtualizacją, jeśli TreeView jest skonfigurowany w następujący sposób?WPF: wirtualizacja TreeView nie działa

<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> 

mam taki, który nie jest wirtualizacja, kiedy rozwinąć węzły (i używać snoop by sprawdzić) Mam wszystkie TreeViewItems tworzone. Zastanawiam się, czy istnieje jakaś kombinacja kontenerów, które uniemożliwiałyby TreeView wirtualizację jego zawartości. (na przykład hostowanie go w StackPanelu)

+0

Ten wpis może pomóc w dostosowaniu wirtualizacji: http://stackoverflow.com/questions/126230/resources-and-guides-to-ui-virtualization-in-wpf – Domokun

Odpowiedz

5

Problem dotyczył stylizacji. Po przeprowadzeniu pewnych badań odkryliśmy, że istnieje nienazwany styl ukierunkowany na TreeView (tj. Jeden z DataType={x:Type TreeView} bez x:Key) i jeden targetujący TreeViewItem w naszym App.xaml (lub odpowiedniku) To było przesłonięcie odpowiednio każdego z nich: ControlTemplate.

Te style nie miały wyzwalaczy do ustawienia ItemsPanel na VirtualizingStackPanel i nie wspomniały o żadnej wirtualizacji. Gdy style są usuwane, TreeView działa dobrze. Mimo że lokalne właściwości ustawiły ItemsPanel i VirtualizingStackPanel.Isvirtualizing="True" na TreeView, właściwości te nie były propagowane do TreeViewItems, więc najwyższy poziom TreeView byłby wirtualizowany, podczas gdy podkategorie nie byłyby (ponieważ ich zachowanie wirtualizacji było zależne od TreeViewItem)