Optimieren der Leistung: Steuerelemente
In Windows Presentation Foundation (WPF) stehen viele gängige Benutzeroberflächenkomponenten zur Verfügung, die in den meisten Windows-Anwendungen verwendet werden. In diesem Thema werden Techniken dargestellt, mit denen Sie die Leistung Ihrer Benutzeroberfläche (UI) optimieren können.
Anzeigen von großen Datasets
WPF-Steuerelemente wie ListView und ComboBox werden verwendet, um Listen von Elementen in einer Anwendung anzuzeigen. Wenn die anzuzeigende Liste sehr groß ist, kann dies die Leistung der Anwendung beeinträchtigen. Dies liegt daran, dass das Standardlayoutsystem einen Layoutcontainer für jedes mit dem Listensteuerelement verknüpfte Element erstellt und dessen Layoutgröße und -position berechnet. Für gewöhnlich müssen Sie nicht alle Elemente gleichzeitig anzeigen; stattdessen zeigen Sie eine Teilmenge an, und der Benutzer scrollt durch die Liste. In diesem Fall macht es Sinn, die UI-Virtualisierung zu verwenden; dies bedeutet, dass die Generierung eines Elementcontainers und die damit verknüpfte Layoutberechnung verzögert werden, bis das Element sichtbar ist.
Die UI-Virtualisierung ist ein wichtiger Aspekt der Listensteuerelemente. Die UI-Virtualisierung ist nicht mit der Datenvirtualisierung zu verwechseln. Bei der UI-Virtualisierung werden nur sichtbare Elemente im Speicher gespeichert; in einem Datenbindungsszenario wird die gesamte Datenstruktur im Speicher gespeichert. Im Gegensatz dazu werden bei der Datenvisualisierung nur die Datenelemente gespeichert, die auf dem Bildschirm im Speicher sichtbar sind.
Standardmäßig ist Benutzeroberflächenvirtualisierung für die Steuerelemente ListView und ListBox aktiviert, wenn ihre Listenelemente an Daten gebunden sind. TreeView-Virtualisierung kann aktiviert werden, indem die angefügte VirtualizingStackPanel.IsVirtualizing-Eigenschaft auf true
festgelegt wird. Wenn Sie Benutzeroberflächenvirtualisierung für benutzerdefinierte Steuerelemente, die von ItemsControl abgeleitet sind, oder für vorhandene Elementsteuerelemente, die die StackPanel-Klasse verwenden (z. B. ComboBox) aktivieren möchten, können Sie ItemsPanel auf VirtualizingStackPanel und IsVirtualizing auf true
festlegen. Allerdings kann es passieren, dass Sie die UI-Virtualisierung für diese Steuerelemente deaktivieren, ohne es zu merken. Durch folgende Bedingungen kann die UI-Virtualisierung deaktiviert werden:
Elementcontainer werden direkt zu ItemsControl hinzugefügt. Wenn eine Anwendung beispielsweise einem ListBox-Element explizit ListBoxItem-Objekte hinzufügt, virtualisiert ListBox die ListBoxItem-Objekte nicht.
Elementcontainer in ItemsControl sind anders geartet. Ein Menu, das Objekte des Typs Separator verwendet, kann beispielsweise keine Wiederverwendung von Elementen implementieren, da Menu Objekte des Typs Separator und MenuItem enthält.
Festlegen von CanContentScroll auf
false
.Festlegen von IsVirtualizing auf
false
.
Bei der Virtualisierung von Elementcontainern ist es maßgeblich, zu wissen, ob Ihnen Informationen bezüglich des zusätzlichen Zustands des Elementcontainers vorliegen, der zu dem Element gehört. Falls dem so ist, müssen Sie den zusätzlichen Zustand speichern. Beispielsweise könnte ein Element in einem Expander-Steuerelement enthalten sein, und der IsExpanded-Status ist an den Container des Elements und nicht an das Element selbst gebunden. Wenn der Container für ein neues Element wiederverwendet wird, wird der aktuelle Wert von IsExpanded für das neue Element verwendet. Außerdem verliert das alte Element den richtigen IsExpanded-Wert.
Im Moment gibt es keine WPF-Steuerelemente, die integrierte Unterstützung für die Datenvirtualisierung bieten.
Wiederverwenden von Containern
Das Wiederverwenden von Containern ist eine Verbesserung der UI-Virtualisierung, die in .NET Framework 3.5 SP1 für Steuerelemente hinzugefügt wurde, die von einem ItemsControl-Element erben. Zudem kann dadurch auch das Scrollen optimiert werden. Wenn ein ItemsControl-Element mit Daten aufgefüllt wird, das Benutzeroberflächenvirtualisierung verwendet, erstellt es einen Elementcontainer für jedes Element, das in die Ansicht gescrollt wird und zerstört den Elementcontainer für jedes Element, das aus der Ansicht gescrollt wird. Das Wiederverwenden von Containern ermöglicht es dem Steuerelement, vorhandene Elementcontainer für verschiedene Datenelemente wiederzuverwenden, sodass Elementcontainer nicht fortlaufend erstellt und zerstört werden müssen, während der Benutzer durch das ItemsControl-Element scrollt. Sie können die Wiederverwendung von Elementen aktivieren, indem Sie die angefügte VirtualizationMode-Eigenschaft auf Recycling festlegen.
Jedes ItemsControl-Element, das Virtualisierung unterstützt, kann Containerwiederverwendung nutzen. Ein Beispiel für das Aktivieren des Wiederverwendens von Containern in einem ListBox-Element finden Sie unter Verbessern der Scrollleistung eines Listenfelds.
Unterstützen bidirektionaler Virtualisierung
VirtualizingStackPanel bietet integrierte Unterstützung für die unidirektionale Benutzeroberflächenvirtualisierung – horizontal oder vertikal. Wenn Sie die bidirektionale Virtualisierung für Ihre Steuerelemente verwenden möchten, müssen Sie ein benutzerdefiniertes Panel implementieren, das die VirtualizingStackPanel-Klasse erweitert. Die VirtualizingStackPanel-Klasse stellt virtuelle Methoden wie OnViewportSizeChanged, LineUp, PageUp und MouseWheelUp zur Verfügung, mit denen Sie eine Änderung im sichtbaren Teil einer Liste erkennen und entsprechend verarbeiten können.
Optimieren von Vorlagen
Die visuelle Struktur enthält alle visuellen Elemente einer Anwendung. Zusätzlich zu den direkt erstellten Objekten enthält es auch durch die Vorlagenerweiterung entstandene Objekte. Wenn Sie beispielsweise ein Button-Element erstellen, erhalten Sie auch ClassicBorderDecorator- und ContentPresenter-Objekte in der visuellen Struktur. Wenn Sie Ihre Steuerelementvorlagen nicht optimiert haben, erstellen Sie so möglicherweise viele überflüssige Objekte in Ihrer visuellen Struktur. Weitere Informationen zur visuellen Struktur finden Sie unter Übersicht über das WPF-Grafikrendering.
Verzögertes Scrollen
Wenn ein Benutzer seinen Daumen über die Scrollleiste zieht, wird die Inhaltsansicht standardmäßig fortlaufend aktualisiert. Wenn das Scrollen in Ihrem Steuerelement verlangsamt ist, ziehen Sie das verzögerte Scrollen in Betracht. Beim verzögerten Scrollen wird der Inhalt nur aktualisiert, wenn der Benutzer seinen Daumen von der Scrollleiste nimmt.
Um verzögertes Scrollen zu implementieren, legen Sie die IsDeferredScrollingEnabled-Eigenschaft auf true
fest. IsDeferredScrollingEnabled ist eine angefügte Eigenschaft und kann auf ScrollViewer und jedes Steuerelement festgelegt werden, das ScrollViewer in seiner Steuerelementvorlage aufweist.
Steuerelemente, die Leistungsfunktionen implementieren
In der unten stehenden Tabelle werden gängige Steuerelemente für das Anzeigen von Daten und deren Unterstützung von Leistungsfunktionen aufgelistet. Im vorherigen Abschnitt finden Sie Informationen zum Aktivieren dieser Funktionen.
Control | Virtualisierung | Wiederverwenden von Containern | Verzögertes Scrollen |
---|---|---|---|
ComboBox | Kann aktiviert werden | Kann aktiviert werden | Kann aktiviert werden |
ContextMenu | Kann aktiviert werden | Kann aktiviert werden | Kann aktiviert werden |
DocumentViewer | Nicht verfügbar | Nicht verfügbar | Kann aktiviert werden |
ListBox | Standard | Kann aktiviert werden | Kann aktiviert werden |
ListView | Standard | Kann aktiviert werden | Kann aktiviert werden |
TreeView | Kann aktiviert werden | Kann aktiviert werden | Kann aktiviert werden |
ToolBar | Nicht verfügbar | Nicht verfügbar | Kann aktiviert werden |
Hinweis
Ein Beispiel für das Aktivieren der Virtualisierung und des Wiederverwendens von Containern in einem TreeView-Element finden Sie unter Verbessern der Leistung von TreeView.
Weitere Informationen
.NET Desktop feedback