2010-11-29 30 views
2

J'ai un problème avec la virtualisation de l'interface utilisateur d'un ListView avec des centaines d'éléments dont les éléments peuvent exposer une propriété de visibilité. Malheureusement la virtualisation ne reconnaît pas la visibilité correcte et rend la barre de défilement plus petite ou plus grande en fonction du nombre d'éléments dans le ViewPort (et non du nombre d'éléments qui ne sont pas repliés dans le ViewPort) à la position défilée.ListView, ListViewItems et Virtualization

Est-il possible d'éviter ce problème sans désactiver la virtualisation?

S'il vous plaît voir exemple ci-joint:

<ListView VerticalAlignment="Stretch" 
      Name="ListViewControl" 
      HorizontalAlignment="Stretch" 
      ItemsSource="{Binding Movies}" 
      ScrollViewer.VerticalScrollBarVisibility="Visible" 
      SelectedItem="{Binding MovieSelected, Mode=OneWayToSource}"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <EventSetter Event="MouseDoubleClick" Handler="ItemClicked" /> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      <Setter Property="Visibility" Value="{Binding Visibility}"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Grid HorizontalAlignment="Stretch"> 

      </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

Répondre

2

Le point de virtualisation est que l'interface utilisateur peut rendre sans avoir à examiner tous les éléments de la collection, non? Mais le résultat que vous voulez en tirer dépend de cela: la barre de défilement ne peut pas calculer précisément la taille du pouce sans savoir combien d'éléments sont visibles, et pour ce faire, il doit regarder chaque élément. Lorsque la virtualisation est activée, la barre de défilement ne regarde pas tous les éléments, elle utilise simplement le nombre d'éléments de la collection comme estimation.

Ce qui pourrait mieux fonctionner, au lieu de réduire les éléments que vous ne voulez pas voir, est de les supprimer de la source des éléments. Utilisez un CollectionView et filtrez les éléments dont Visibility est Visibility.Collapsed. Le coût de la visite de chaque élément de la collection de base est toujours comptabilisé pour déterminer s'il doit apparaître dans la vue, mais il sera probablement un peu plus rapide si cela est fait en amont des éléments de la collection rendus dans l'interface utilisateur.