Dieser Teil der Windows Presentation Foundation 4.5 Serie beschäftigt sich mit den Neuerungen rund um die Klasse VirtualizingPanel. Ein VirtualizingPanel wird eingesetzt, wenn die Performance eines ItemsControl zu optimieren ist. Der Vorteil liegt darin, dass nicht für alle Kindelemente eines Panels die entsprechenden UI-Elemente erstellt werden, sondern lediglich die, die angezeigt werden. Gerade bei vielen Elementen ergibt dies einen großen Performanceunterschied.
In Version 4.5 der Windows Presentation Foundation wurden der abstrakten Klasse VirtualizingPanel eine Reihe Attached Properties verpasst:
- CacheLength/CacheLengthUnit
- IsContainerVirtualizable
- IsVirtualizing
- IsVirtualizingWhenGrouping
- ScrollUnit
- VirtualizationMode
Dabei sind CacheLength, CacheLenghtUnit, IsContainerVirtualizable, IsVirtualizingWhenGrouping und ScrollUnit tatsächlich neu.
VirtualizingPanel – Einführung
Das VirtualizingPanel war bereits seit Anfang an in der WPF vorhanden. Damit bietet sich die Möglichkeit, nicht alle UI-Elemente eines ItemsControl sofort für die Visualisierung erstellen zu müssen. Dies kostet wertvolle Ressourcen (CPU, Speicher) und kann bei zahlreichen Einträgen durchaus länger dauern. Stattdessen wird nur ein Teil der Elemente erstellt – und zwar diejenigen, die tatsächlich zur Anzeige kommen.
Sehen wir uns den zeitlichen Unterschied an:
CacheLength/CacheLengthUnit
Ab WPF 4.5 kann ein Cache der Elemente erstellt werden, die aktuell nicht zur Anzeige kommen. Hierfür kann per CacheLengthUnit die Einheit des Cachings eingestellt werden. Möglich sind:
- Item
- Page
- Pixel
Auswirkung hat diese Einstellung auf CacheLength. Hiermit wird nun die Größe des Caches vor und nach dem Viewport (das ist der sichtbare Bereich) festgelegt. So kann vermieden werden, dass die UI-Elemente erst dann generiert werden, wenn sie in den sichtbaren Bereich kommen (was natürlich eine negative Auswirkung auf die User-Experience hätte).
1: <ListBox ItemsSource="{Binding VirtualizedBooks}"
2: ItemTemplate="{StaticResource BookTemplate}"
3: VirtualizingPanel.IsVirtualizing="True"
4: VirtualizingPanel.CacheLength="1,2"
5: VirtualizingPanel.CacheLengthUnit="Page"/>
IsContainerVirtualizable
Darüber kann für einzelne Items festgelegt werden, ob sie durch das VirtualizingPanel virtualisiert werden sollen, oder nicht. Per Standard ist der gesetzte Wert true.
IsVirtualizing
Diese Methode stand bis dato nur der abgeleiteten Klasse VirtualizingStackPanel (per Attached Property) zur Verfügung. Nun steht sie als Attached Property auch für die Klasse VirtualizingPanel zur Verfügung.
Virtualisierung gruppierter Daten
Bei gruppierten Daten ging die Virtualisierung bis dato verloren. Dies ist zwar per Standard noch immer so, kann aber via IsVirtualizingWhenGrouping geändert werden.
ScrollUnit
Bis dato wurden die Elemente einer Liste immer vollständig angezeigt und gescrollt. Mit ScrollUnit besteht nun die Möglichkeit, das Verhalten zu konfigurieren. Als Möglichkeiten stehen Item und Pixel zur Verfügung.
1: <ListBox ItemsSource="{Binding VirtualizedBooks}"
2: ItemTemplate="{StaticResource BookTemplate}"
3: VirtualizingPanel.ScrollUnit="Pixel"/>
Abgesehen vom Unterschied beim Scrollen, ist ein weiterer im untenstehenden Screenshot ersichtlich:
Dadurch, dass nur per Element gescrollt wird, kann es zu freien Flächen kommen. Dies kann durch das Setzen von ScrollUnit auf den Wert Pixel vermieden werden, da so auch abgeschnittene Elemente dargestellt werden können.
VirtualizationMode
Diese Methode stand bis dato nur der abgeleiteten Klasse VirtualizingStackPanel (per Attached Property) zur Verfügung. Nun steht sie als Attached Property auch für die Klasse VirtualizingPanel zur Verfügung. An den möglichen Einstellungen hat sich nichts geändert. Nach wie vor stehen die Werte Standard (der Container wird erstellt und wieder verworfen) und Recycling (die Container werden wiederverwendet) parat.
Beispiel
Nachfolgend findet sich das erstellte Beispiel, welches den grundlegenden Unterschied zwischen der Verwendung eines VirtualizingPanel und ohne zeigt. Auch die weiteren Einstellungen können damit getestet werden.