2010-11-02 7 views
4

J'utilise une arborescence virtualisée dans WPF pour afficher une hiérarchie profonde à 3 niveaux avec un plus grand nombre de nœuds enfants (5000+).Bogue défilant dans WPF virtualisé Treeview

<TreeView Grid.Row="0" Grid.Column="0" Name="TestTree" ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="True"> 
... 
</TreeView> 

Ce qui arrive est que si j'élargissons les nœuds enfants au 3ème niveau et faites défiler jusqu'au bout le contenu n'affiche pas correctement et la barre de défilement « sauts périlleux arrière » et je peux continuer à faire défiler vers le bas pour toujours, le comportement se répète après un peu plus de défilement.

Cela se produit uniquement en mode virtualisé, mais malheureusement, en raison du grand nombre de nœuds enfants, le temps de chargement de l'arborescence en mode non virtualisé est prohibitif.

J'ai lu les liens suivants sur SO here et le thread d'origine sur les forums MSDN here mais la solution proposée d'appeler UpdateLayout() dans le gestionnaire SelectedItemChanged ne fonctionne pas pour moi.

Quelqu'un d'autre a-t-il déjà expérimenté ce comportement étrange, et si oui existe-t-il une solution de contournement?

Appréciez toute entrée - merci!

Répondre

0

as-tu essayé de charger les articles paresseux ?? Ce que je veux dire, c'est que vous pouvez charger d'abord (sans virtualiser) les nœuds de la racine, puis quand chacun de ces nœuds est développé, chargez-le.

J'utilise habituellement un TreeViewItemViewModelClass dans ce cas, quelque chose comme:

public class TreeViewItemViewModel : INotifyPropertyChanged 
{ 
    public IEnumerable<TreeViewItemViewModel> Childs { get; } 
    public bool IsSelected { get; set; } 
    public bool IsExpanded { get; set; } 
    (...) 
} 

puis dans le ItemContainerStyle du TreeView avec une liaison de liaison TwoWay le IsSelected et les propertires IsExpanded, puis dans le poseur de la propriété IsExpanded vous chargez tous ses enfants.

J'ai testé cette approche, avec des arbres qui en théorie ont plus de 5000 articles mais jamais avec tous les articles chargés en même temps.

Hope this helps ...

+0

Le problème est que la plupart des noeuds sont au même niveau, cette optimisation ne serait pas vraiment me acheter quoi que ce soit que je dois charger tous ces nœuds en même temps en tous cas. – BrokenGlass