2010-11-22 3 views
5

Qu'est-ce qui peut empêcher la virtualisation de TreeView si TreeView est configuré comme suit?WPF: la virtualisation TreeView ne fonctionne pas

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

J'ai une qui n'est pas virtualiser, quand je développez les nœuds (et Snoop utilisation pour vérifier) ​​j'ai tous les TreeViewItems en cours de création. Je me demande s'il existe une combinaison de conteneurs qui empêcherait TreeView de virtualiser son contenu. (comme l'héberger dans un StackPanel par exemple)

+0

Ce message peut vous aider dans la personnalisation de la virtualisation: http://stackoverflow.com/questions/126230/resources-and-guides-to-ui-virtualization-in-wpf – Domokun

Répondre

5

Le problème était avec le style. Après quelques recherches, nous avons trouvé qu'il y avait un style sans nom ciblant le TreeView (c'est-à-dire un avec DataType={x:Type TreeView} sans x:Key) et un ciblant le TreeViewItem dans notre App.xaml (ou équivalent) Il remplaçait le ControlTemplate pour chacun respectivement.

Ces styles n'avaient pas les déclencheurs pour définir le ItemsPanel sur VirtualizingStackPanel et ne mentionnaient aucune virtualisation. Lorsque les styles sont supprimés, TreeView fonctionne correctement. Même si les propriétés locales définissent ItemsPanel et VirtualizingStackPanel.Isvirtualizing="True" sur TreeView ces propriétés n'étaient pas propulsées au TreeViewItems, donc le niveau supérieur de TreeView virtualiserait alors que les sous-catégories ne le feraient pas (car leur comportement de virtualisation dépendait du TreeViewItem)