VirtualizingWrapPanel

WPF besitzt mit dem VirtualizingStackPanel und dem DataGridCellsPanel zwei Subklassen, die von der abstrakten Klasse VirtualizingPanel abgeleitet sind. Das VirtualizingStackPanel wird in der Regel innerhalb von anderen Steuerelementen wie z.B. der ListBox oder einem ListView zum Anordnen und damit zur Anzeige der ListItems verwendet. Warum wird dort kein normales Stackpanel verwendet? Die Antwort ist relativ einfach: Aus Performancegründen. Stellen Sie sich eine ListView mit einigen tausend Einträgen vor. Bei einem VirtualizingStackPanel werden nur die Einträge erstellt, die im aktuell sichtbaren Bereich des ListViews liegen. Erst wenn der Anwender mit dem Scrollen beginnt werden die anderen Einträge erstellt. Bei einem normalen StackPanel würden zunächst alle Items (also auch die zunächst nicht sichtbaren) erstellt. Das führt in der Regel zu deutlichen Performanceproblemen. Unter Umständen kann der Bildschirm mehrere Minuten einfrieren bevor alle Elemente gerendert sind. (Das DataGridCellsPanel arbeitet analog wie das VirtualizingStackPanel. Allerdings kommt es lediglich intern im DataGrid zum Einsatz.)

In einem Kundenprojekt habe ich nun analog ein VirtualizingWrapPanel benötigt, da ich eine größere Anzahl von Items innerhalb eines ListViews in Form eines WrapPanels darstellen wollte. Leider stellt einem das .Net Framework dafür out of the box keine entsprechende Klasse zur Verfügung. Abhilfe verspricht hier das folgende Projekt: http://www.codeproject.com/Articles/75847/Virtualizing-WrapPanel. Das Projekt liefert ein solches frei verfügbares VirtualizingWrapPanel inklusive SourceCode. Leider haben meine Tests gezeigt, dass dieses Panel zumindest für meine Ansprüche nicht performant genug ist. Beim Vergrößern eines Fensters ruckelte es doch ziemlich stark, wenn die Einträge neu umgebrochen werden müssen. Beim Scrollen gibt es teilweise den gleichen Effekt. Außerdem funktionierte es in meinem Anwendungsfall nicht ohne Probleme. Ab und an kam es leider zu Abstürzen bzw. unbehandelten Exceptions.

Die einzige vernünftige Lösung bietet aktuell meines Wissens nach die Firma Binarymission (http://binarymission.co.uk/binaryvirtualizingwrappanelwpf.htm). Deren VirtualizingWrapPanel funktionierte in meinem Anwendungsfall ohne Probleme. Das Produkt ist aber leider kostenpflichtig!

Falls jemand eine bessere Lösung weiß, wäre ich für einen entsprechenden Hinweis sehr dankbar!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s