2009-09-07 8 views
32

Ich möchte eine einfache Beschreibung der Implementierung eines virtualisingstackpanel für eine ItemsControl, die auf eine ObservableCollection in meinem MVVM datengebunden ist.WPF VirtualizationStackPanel für erhöhte Leistung

Ich habe eine ItemsControl Instanz für jede Registerkarte in einem Registersteuerelement, und das Wechseln Registerkarten wird sehr langsam, wenn die ItemsControl größer wird.

Was kann ich tun, um die App zu beschleunigen?

Ich öffnete einen WPF-Profiler und sah, dass jedes Element (das ein benutzerdefiniertes Benutzersteuerelement ist), das in meinem ItemsControl jeder Registerkarte angezeigt wurde, seine eigene ContentPresenter hatte. Also hatte ich im Wesentlichen 100 Content-Moderatoren, die alle für 100 Artikel in meinem ObservableCollection in MVVM laufen. Ist das korrekt? Wie kann ich optimieren?

Antwort

48

Es gibt zwei Techniken, die eine große Hilfe sein könnten. Beide werden von Bea Stolnitz auf ihrer blog sehr gut beschrieben.

Die erste ist UI Virtualization und die zweite Data Virtualization

In UI-Virtualisierung ist, dass Sie Dinge wie VirtualizingStackPanel verwenden die Benutzeroberfläche ziehen weniger Dinge zu machen.

Daten Virtualisierung macht Sie sicher nicht eine Million Objekte in den Speicher bringen, wenn Sie nur 100.

So UI-Virtualisierung minimiert die Anzahl der Dinge gezogen und Datenvirtualisierung minimiert die Anzahl der Dinge zu zeigen, werden das könnte gemalt werden.

Hoffnung, die

9

hilft I ind WPF genau das gleiche Problem hatte TabControl und Datagrid verwenden. Durch das Erweitern der DataGrid-Elementgröße wird das Wechseln von Tabs sehr langsam! Danach habe ich diesen Beitrag gefunden, in dem ich den Blog von Bea Stolnitz gelesen habe. Das gab mir den Hinweis auf google "wpf tabcontrol VirtualizingStackPanel" , die mir den Link zu DrWPF gibt: http://groups.google.com/group/wpf-disciples/browse_thread/thread/6f3531a1720252dd

Er beschreibt genau das Problem und gibt die Lösung :-))

.... Der perf Hit ist während des Baus des Baumes. Wenn Sie jedoch
einen typischen MVVM-Ansatz mit einer Bindung für die ItemsSource-Eigenschaft des TabControl verwenden, muss der gesamte Baum jedes Mal neu erstellt werden, wenn
ein Tab-Element ausgewählt wird. Dies ist normalerweise eine sehr teure Operation. ....