2010-11-22 14 views
5

Cosa può impedire a TreeView di virtualizzare se TreeView è configurato come segue?WPF: virtualizzazione TreeView non funzionante

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

Ho uno che non è virtualizzando, quando espandere i nodi (e uso snoop controlla) ho tutte le TreeViewItems da creare. Mi chiedo se ci sia una combinazione di contenitori che impedirebbe a TreeView di virtualizzare il suo contenuto. (come ad esempio l'hosting in uno StackPanel)

+0

Questo post può essere di aiuto nella personalizzazione della virtualizzazione: http://stackoverflow.com/questions/126230/resources-and-guides-to-ui-virtualization-in-wpf – Domokun

risposta

5

Il problema era con lo stile. Dopo alcune ricerche abbiamo rilevato che c'era uno stile senza nome che utilizzava il TreeView (ovvero uno con DataType={x:Type TreeView} senza un x:Key) e uno che puntava allo TreeViewItem nella nostra App.xaml (o equivalente). Stava ignorando rispettivamente lo ControlTemplate per ciascuno.

Questi stili non hanno i trigger per impostare ItemsPanel su un VirtualizingStackPanel e non hanno menzionato alcuna virtualizzazione. Quando gli stili vengono rimossi, TreeView funziona correttamente. Anche se le proprietà locali impostano su , queste proprietà non venivano propagate allo TreeViewItems in modo che il livello principale di TreeView venisse virtualizzato mentre le sottocategorie non lo sarebbero (poiché il loro comportamento di virtualizzazione dipendeva dallo TreeViewItem)