web-dev-qa-db-fra.com

WPF VirtualizingStackPanel pour des performances accrues

Je voudrais une description simple de la façon d'implémenter un virtualizingstackpanel pour un ItemsControl qui est lié aux données à un ObservableCollection dans mon MVVM.

J'ai une instance de ItemsControl pour chaque onglet dans un contrôle d'onglet, et le changement d'onglet devient TRÈS lent lorsque le ItemsControl grossit.

Que puis-je faire pour accélérer l'application?

J'ai ouvert un profileur WPF et j'ai vu que chaque élément (qui est un contrôle utilisateur personnalisé) affiché dans mon ItemsControl de chaque onglet avait son propre ContentPresenter. Donc, j'avais essentiellement 100 présentateurs de contenu fonctionnant tous pour 100 éléments dans mon ObservableCollection dans MVVM. Est-ce correct? Comment puis-je optimiser?

34
bluebit

Il existe deux techniques qui pourraient être d'une grande aide. Les deux sont très bien décrits par Bea Stolnitz sur elle blog .

Le premier est virtualisation de l'interface utilisateur et le second est virtualisation des données

Dans la virtualisation de l'interface utilisateur, vous utilisez des éléments tels que VirtualizingStackPanel pour que l'interface utilisateur dessine moins d'éléments.

La virtualisation des données vous permet de ne pas mettre un million d'objets en mémoire alors que vous n'en afficherez que 100.

Ainsi, la virtualisation de l'interface utilisateur minimise le nombre d'éléments dessinés et la virtualisation des données minimise le nombre d'éléments pouvant être dessinés.

J'espère que cela pourra aider

51
Mike Two

J'ai eu exactement le même problème avec WPF en utilisant TabControl et DataGrid. En augmentant la taille de l'élément DataGrid, le changement d'onglet devient TRÈS lent! Après cela, j'ai trouvé cet article lisant le blog de Bea Stolnitz comme le supposait la réponse précédente. Cela m'a donné un indice pour google "wpf tabcontrol VirtualizingStackPanel" qui me donne le lien vers DrWPF: http://groups.google.com/group/wpf-disciples/browse_thread/thread/6f3531a1720252dd

Il décrit exactement le problème et donne la solution :-))

.... Le coup de performance est lors de la construction de l'arbre. Malheureusement, si
vous utilisez une approche MVVM typique avec une liaison sur la ItemsSource
de TabControl, l’arborescence entière doit être reconstruite à chaque fois
un élément d'onglet est sélectionné. Il s'agit généralement d'une opération très coûteuse. ....

9
user227789