Optimieren der Leistung: Steuerelemente
Windows Presentation Foundation (WPF) enthält viele der gängigen Ui-Komponenten (User-Interface), die in den meisten Windows-Anwendungen verwendet werden. Dieses Thema enthält Techniken zur Verbesserung der Leistung ihrer Benutzeroberfläche.
Anzeigen großer Datensätze
WPF-Steuerelemente wie die ListView und ComboBox werden verwendet, um Listen von Elementen in einer Anwendung anzuzeigen. Wenn die anzuzeigende Liste groß ist, kann die Leistung der Anwendung beeinträchtigt werden. Dies liegt daran, dass das Standardlayoutsystem einen Layoutcontainer für jedes Element erstellt, das dem Listensteuerelement zugeordnet ist, und die Layoutgröße und -position berechnet. In der Regel müssen Sie nicht alle Elemente gleichzeitig anzeigen. Stattdessen zeigen Sie eine Teilmenge an, und der Benutzer scrollt durch die Liste. In diesem Fall ist es sinnvoll, UI Virtualisierungzu verwenden, was bedeutet, dass die Erzeugung von Elementcontainern und die zugeordnete Layoutberechnung für Elemente zurückgestellt wird, bis die Elemente sichtbar sind.
Die UI-Virtualisierung ist ein wichtiger Aspekt von Listensteuerelementen. Die UI-Virtualisierung sollte nicht mit der Datenvirtualisierung verwechselt werden. Bei der UI-Virtualisierung werden nur sichtbare Elemente im Arbeitsspeicher gehalten, während in einem Datenbindungsszenario die gesamte Datenstruktur gespeichert wird. Im Gegensatz dazu speichert die Datenvirtualisierung nur die Datenelemente, die auf dem Bildschirm im Arbeitsspeicher sichtbar sind.
Standardmäßig ist die UI-Virtualisierung für die steuerelemente ListView und ListBox aktiviert, wenn ihre Listenelemente an Daten gebunden sind. TreeView Virtualisierung kann aktiviert werden, indem die angefügte Eigenschaft VirtualizingStackPanel.IsVirtualizing auf true
festgelegt wird. Wenn Sie die UI-Virtualisierung für benutzerdefinierte Steuerelemente aktivieren möchten, die von ItemsControl oder vorhandenen Elementsteuerelementen abgeleitet werden, die die StackPanel Klasse verwenden, z. B. ComboBox, können Sie die ItemsPanel auf VirtualizingStackPanel festlegen und IsVirtualizing auf true
festlegen. Leider können Sie die UI-Virtualisierung für diese Steuerelemente deaktivieren, ohne sie zu erkennen. Im Folgenden finden Sie eine Liste der Bedingungen, die die UI-Virtualisierung deaktivieren.
Container für Elemente werden direkt zum ItemsControlhinzugefügt. Wenn eine Anwendung z. B. ListBoxItem-Objekte explizit zu einem ListBoxhinzufügt, virtualisiert die ListBox die ListBoxItem-Objekte nicht.
Gegenstandscontainer in der ItemsControl sind von unterschiedlichen Typen. Beispielsweise kann ein Menu, der Separator Objekte verwendet, das Elementrecycling nicht implementieren, da die Menu Objekte vom Typ Separator und MenuItementhält.
Festlegen CanContentScroll auf
false
.Setze IsVirtualizing auf
false
.
Ein wichtiger Aspekt beim Virtualisieren von Elementcontainern ist, ob zusätzliche Statusinformationen vorhanden sind, die einem Elementcontainer zugeordnet sind, der zum Element gehört. In diesem Fall müssen Sie den zusätzlichen Status speichern. Sie können z. B. ein Element in einem Expander-Steuerelement enthalten, und der IsExpanded Zustand 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. Darüber hinaus verliert das alte Element den richtigen IsExpanded Wert.
Derzeit bieten keine WPF-Steuerelemente integrierte Unterstützung für die Datenvirtualisierung.
Behälterrecycling
Eine Optimierung der UI-Virtualisierung, die im .NET Framework 3.5 SP1 für Steuerelemente hinzugefügt wurde, die von ItemsControl erben, ist Containerrecycling, die auch die Bildlaufleistung verbessern kann. Wenn eine ItemsControl, die UI-Virtualisierung verwendet, mit Elementen gefüllt wird, erstellt sie einen Element-Container für jedes Element, das in die Ansicht scrollt, und entfernt den Element-Container für jedes Element, das aus der Ansicht heraus scrollt. Containerrecycling ermöglicht es dem Steuerelement, die vorhandenen Elementcontainer für verschiedene Datenelemente wiederzuverwenden, sodass Elementcontainer nicht ständig erstellt und zerstört werden, wenn der Benutzer den ItemsControlscrollt. Sie können das Wiederverwerten von Elementen aktivieren, indem Sie die angefügte eigenschaft VirtualizationMode auf Recyclingfestlegen.
Jede ItemsControl, die Virtualisierung unterstützt, kann Container-Recycling verwenden. Ein Beispiel, wie Containerrecycling bei einem ListBoxaktiviert wird, finden Sie unter Verbesserung der Bildlaufleistung einer ListBox.
Unterstützung der bidirektionalen Virtualisierung
VirtualizingStackPanel bietet integrierte Unterstützung für die UI-Virtualisierung in eine Richtung, entweder horizontal oder vertikal. Wenn Sie bidirektionale Virtualisierung für Ihre Steuerelemente verwenden möchten, müssen Sie einen benutzerdefinierten Bereich implementieren, der die VirtualizingStackPanel Klasse erweitert. Die VirtualizingStackPanel Klasse macht virtuelle Methoden wie OnViewportSizeChanged, LineUp, PageUpund MouseWheelUpverfügbar. Mit diesen virtuellen Methoden können Sie eine Änderung im sichtbaren Teil einer Liste erkennen und entsprechend behandeln.
Optimieren von Vorlagen
Der visuelle Baum enthält alle visuellen Elemente in einer Anwendung. Zusätzlich zu den direkt erstellten Objekten enthält sie auch Objekte aufgrund der Vorlagenerweiterung. Wenn Sie beispielsweise ein Button-Objekt erstellen, erhalten Sie auch ClassicBorderDecorator- und ContentPresenter-Objekte im visuellen Baum. Wenn Sie Ihre Steuerelementvorlagen nicht optimiert haben, könnten Sie viele unnötige Objekte im visuellen Baum erstellen. Weitere Informationen zur visuellen Struktur finden Sie unter WPF Graphics Rendering Overview.
Verzögerter Bildlauf
Wenn der Benutzer den Daumen standardmäßig auf eine Bildlaufleiste zieht, wird die Inhaltsansicht kontinuierlich aktualisiert. Wenn der Bildlauf in Ihrem Steuerelement langsam ist, sollten Sie das verzögertes Scrollen verwenden. Beim verzögerten Bildlauf wird der Inhalt nur aktualisiert, wenn der Benutzer den Daumen loslässt.
Um verzögerten Bildlauf zu implementieren, legen Sie die eigenschaft IsDeferredScrollingEnabled auf true
fest. IsDeferredScrollingEnabled ist eine angefügte Eigenschaft und kann für ScrollViewer und jedes Steuerelement mit einer ScrollViewer in der Steuerelementvorlage festgelegt werden.
Steuerelemente, die Leistungsmerkmale implementieren
In der folgenden Tabelle sind die allgemeinen Steuerelemente zum Anzeigen von Daten und deren Unterstützung von Leistungsfeatures aufgeführt. Informationen zum Aktivieren dieser Features finden Sie in den vorherigen Abschnitten.
Steuerung | Virtualisierung | Container-Recycling | Verzögerter Bildlauf |
---|---|---|---|
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 | Vorgabe | Kann aktiviert werden | Kann aktiviert werden |
ListView | Standardeinstellung | 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 |
Anmerkung
Ein Beispiel zum Aktivieren der Virtualisierung und Containerrecycling auf einem TreeViewfinden Sie unter Optimieren Sie die Leistung einer TreeView-.
Siehe auch
.NET Desktop feedback