2010-09-14 6 views
1

Je ListBox suivant:VirtualizingStackPanel ne fonctionne pas

<ScrollViewer> 
    <!--Spec Definitions--> 
    <ListBox DataContext="{Binding SpecPackageSpecGroupListViewModel}" 
     VirtualizingStackPanel.IsVirtualizing="True" 
     VirtualizingStackPanel.VirtualizationMode="Recycling" 
     ScrollViewer.IsDeferredScrollingEnabled="True" 
     ItemContainerStyle="{StaticResource SpecPackageSpecGroupListBoxStyle}" 
     ItemsSource="{Binding SortedChildren}" 
     Background="Transparent" 
     BorderThickness="0" SelectionMode="Extended" 
     Margin="5,5,5,5"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Controls:SpecPackageSpecGroupControl/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</ScrollViewer> 

Cette liste est censé accueillir 1000 ~ articles, mais complexes. Je veux qu'il fonctionne avec VirtualizingStackPanel, j'ai donc définir la configuration XAML la visualisation à:

VirtualizingStackPanel.IsVirtualizing="True" 
VirtualizingStackPanel.VirtualizationMode="Recycling" 

Mon problème est que je pense que cela ne fonctionne pas - d'abord - il faut un temps très long à charger ~ 700 articles, et d'autre part, quand je frappe un point d'arrêt sur mon constructeur de contrôle - je peux le voir est appelé 700 fois:

public static int Counter = 0; 

public SpecPackageSpecGroupControl() 
{ 
    InitializeComponent(); 

    Counter++; 
    if (Counter%100 == 0) 
     Console.WriteLine("Hi"); 
} 

je romps point sur la Console.WriteLine (« Salut ») et je peux voir que le compteur statique a atteint 700.

Donc, fondamentalement, l'UIElem Les ents sont créés bien que ce soit un mode virtuel. Est-ce que je me méprends sur le mode de virtualisation, ou y a-t-il quelque chose que je fais de mal? Ne le placez pas dans un ScrollViewer.

Répondre

3

Le XAML que vous avez collé contourne en effet la virtualisation mais pour une raison différente: le ListBox s'étend complètement (sans défilement) parce que le scrollViewer le permet. Parce qu'il est entièrement 'étendu', le ListBox n'utilise pas la virtualisation. Il utilisera son afficheur de défilement intégré si vous le placez dans un conteneur normal - Border, Grid, etc.

+0

vous avez sauvé ma journée! – alizx