Optimieren der Leistung: Steuerelemente
Windows Presentation Foundation (WPF) schließt viele der allgemeinen Benutzeroberflächenkomponenten ein, die in den meisten Windows-Anwendungen verwendet werden. In diesem Thema werden Methoden zum Verbessern der Leistung der Benutzeroberfläche beschrieben.
Dieses Thema enthält folgende Abschnitte.
- Anzeigen von großen DataSets
- Containerwiederverwendung
- Unterstützung der bidirektionalen Virtualisierung
- Optimieren von Vorlagen
- Verzögerter Bildlauf
- Steuerelemente, die Leistungsfeatures implementieren
- Verwandte Abschnitte
Anzeigen von großen DataSets
WPF-Steuerelemente, wie ListView und ComboBox, werden zum Anzeigen von Elementlisten in einer Anwendung verwendet. Wenn die anzuzeigende Liste groß ist, kann die Leistung der Anwendung beeinträchtigt werden. Dies ist darauf zurückzuführen, dass das Standardlayoutsystem einen Layoutcontainer für jedes Elemente erstellt, das dem Listensteuerelement zugeordnet ist, und seine Layoutgröße und Position berechnet. In der Regel brauchen Sie nicht alle Elemente gleichzeitig anzuzeigen. Stattdessen zeigen Sie eine Teilmenge an und der Benutzer führt einen Bildlauf durch die Liste durch. In diesem Fall ist es sinnvoll, die Virtualisierung der Benutzeroberfläche zu verwenden. Das heißt, die Elementcontainergenerierung und Berechnung des zugeordneten Layouts wird für ein Element zurückgestellt, bis das Element sichtbar ist.
Die Virtualisierung der Benutzeroberfläche ist ein wichtiger Aspekt von Listen-Steuerelementen. Die Virtualisierung der Benutzeroberfläche sollte nicht mit der Datenvirtualisierung verwechselt werden. Bei der Virtualisierung der Benutzeroberfläche werden lediglich die sichtbaren Elemente gespeichert, in einem datengebundenen Szenario wird jedoch die gesamte Datenstruktur gespeichert. Im Gegensatz dazu werden bei der Datenvirtualisierung nur die Datenelemente gespeichert, die auf dem Bildschirm sichtbar sind.
Standardmäßig ist die Virtualisierung der Benutzeroberfläche für die Steuerelemente ListView und ListBox aktiviert, wenn die Listenelemente an Daten gebunden sind. Die TreeView-Virtualisierung kann durch Festlegen der angefügten VirtualizingStackPanel.IsVirtualizing-Eigenschaft auf true aktiviert werden. Falls Sie die Virtualisierung der Benutzeroberfläche für benutzerdefinierte Steuerelemente aktivieren möchten, die von ItemsControl abgeleitet sind, oder für bereits vorhandene Steuerelemente, die die StackPanel-Klasse verwenden, wie ComboBox, können Sie ItemsPanel auf VirtualizingStackPanel und IsVirtualizing auf true festlegen. Leider können Sie die Virtualisierung der Benutzeroberfläche für diese Steuerelemente deaktivieren, ohne sich dessen bewusst zu sein. Im Folgenden erhalten Sie eine Liste der Bedingungen, die die Virtualisierung der Benutzeroberfläche deaktivieren.
ItemsControl werden Elementcontainer direkt hinzugefügt. Falls z. B. eine Anwendung einem ListBox ausdrücklich ListBoxItem-Objekte hinzufügt, virtualisiert ListBox die ListBoxItem-Objekte nicht.
CanContentScroll wurde auf false festgelegt.
IsVirtualizing wurde auf false festgelegt.
Verwenden der Elementgruppierung.
Derzeit bieten keine WPF-Steuerelemente eine integrierte Unterstützung der Datenvirtualisierung.
Containerwiederverwendung
Eine Optimierung der Virtualisierung der Benutzeroberfläche, die im .NET Framework 3.5 SP1 für Steuerelemente hinzugefügt wurde, die von ItemsControl erben, stellt die Containerwiederverwendung dar, mit der auch die Bildlaufleistung verbessert werden kann. Wenn ein ItemsControl, das die Virtualisierung der Benutzeroberfläche verwendet, mit Daten gefüllt wird, wird ein Elementcontainer für jedes Element erstellt, das durch einen Bildlauf sichtbar wird, und der Elementcontainer für jedes Element zerstört, das nicht mehr im Bildlauf sichtbar ist. Mit der Containerwiederverwendung wird das Steuerelement aktiviert, um die bereits vorhandenen Elementcontainer für verschiedene Datenelemente so wieder zu verwenden, dass die Elementcontainer nicht ständig erstellt und zerstört werden, wenn der Benutzer einen Bildlauf durch ItemsControl ausführt. Sie können die Elementwiederverwendung durch das Festlegen von VirtualizationMode auf Recycling aktivieren.
Die Containerwiederverwendung wird nicht verwendet, wenn einer der folgenden Fälle eintritt:
ItemsControl werden Elementcontainer direkt hinzugefügt. Zum Beispiel werden einem ListBox-Steuerelement ListBoxItem-Objekte direkt hinzugefügt.
Elementcontainer im ItemsControl weisen verschiedene Typen auf. So kann Menu, das Separator-Objekte verwendet, keine Elementwiederverwendung implementieren, da Menu Objekte vom Typ Separator und MenuItem enthält.
Ein wichtiger Aspekt beim Wiederverwenden von Elementcontainern ist, ob einem Elementcontainer, der zu dem Element gehört, zusätzliche Zustandsinformationen zugeordnet sind. In diesem Fall müssen Sie den zusätzlichen Zustand speichern. So könnte sich beispielsweise in einem Expander-Steuerelement ein Element befinden, und der Zustand IsExpanded ist an den Elementcontainer gebunden und nicht an das Element selbst. Wenn der Container für ein neues Element wieder verwendet wird, wird der aktuelle Wert von IsExpanded für das neue Element verwendet. Außerdem verliert das alte Element den richtigen IsExpanded-Wert.
Jedes ItemsControl, das die Virtualisierung unterstützt, kann die Containerwiederverwendung verwenden. Ein Beispiel zur Aktivierung der Containerwiederverwendung für ein ListBox finden Sie unter Gewusst wie: Verbessern der Bildlaufleistung eines Listenfelds.
Unterstützung der bidirektionalen Virtualisierung
VirtualizingStackPanel bietet eine horizontale oder vertikale integrierte Unterstützung in eine Richtung für die Virtualisierung der Benutzeroberfläche. Falls Sie für Ihre Steuerelemente die bidirektionale Virtualisierung verwenden möchten, müssen Sie ein benutzerdefiniertes Panel implementieren, das die VirtualizingStackPanel-Klasse erweitert. Die VirtualizingStackPanel-Klasse macht virtuelle Methoden, wie OnViewportSizeChanged, LineUp, PageUp und MouseWheelUp verfügbar. Mit diesen virtuellen Methoden können Sie eine Veränderung im sichtbaren Teil einer Liste erkennen und entsprechend bearbeiten.
Optimieren von Vorlagen
Die visuelle Struktur enthält alle visuellen Elemente in einer Anwendung. Zusätzlich zu den direkt erstellten Objekten enthält es auch Objekte aufgrund der Vorlagenerweiterung. Wenn Sie z. B. eine Button erstellen, rufen Sie gleichzeitig auch ClassicBorderDecorator- und ContentPresenter-Objekte in der visuellen Struktur ab. Falls Sie Ihre Steuerelementvorlagen nicht optimiert haben, erstellen Sie u. U. viele zusätzliche unnötige Objekte in der visuellen Struktur. Weitere Informationen über die visuelle Struktur finden Sie unter Übersicht über das WPF-Grafikrendering.
Verzögerter Bildlauf
Wenn der Benutzer das Bildlauffeld einer Bildlaufleiste zieht, wird die Inhaltsansicht kontinuierlich aktualisiert. Wenn der Bildlauf im Steuerelement langsam ist, erwägen Sie die Verwendung des verzögerten Bildlaufs. Beim verzögerten Bildlauf wird der Inhalt nur aktualisiert, wenn der Benutzer das Bildlauffeld loslässt.
Legen Sie für die Implementierung des verzögerten Bildlaufs die IsDeferredScrollingEnabled-Eigenschaft auf true fest. IsDeferredScrollingEnabled ist eine angefügte Eigenschaft, die für das ScrollViewer-Objekt und jedes Steuerelement festgelegt werden kann, das in der Steuerelementvorlage ein ScrollViewer-Objekt enthält.
Steuerelemente, die Leistungsfeatures implementieren
In der folgenden Tabelle sind die allgemeinen Steuerelemente zum Anzeigen von Daten und ihrer Unterstützung von Leistungsfeatures aufgeführt. Informationen über das Aktivieren dieser Features finden Sie in den vorherigen Abschnitten.
Steuerelement |
Virtualisierung |
Containerwiederverwendung |
Verzögerter Bildlauf |
---|---|---|---|
Kann aktiviert werden |
Kann aktiviert werden |
Kann aktiviert werden |
|
Kann aktiviert werden |
Kann aktiviert werden |
Kann aktiviert werden |
|
Nicht verfügbar |
Nicht verfügbar |
Kann aktiviert werden |
|
Standard |
Kann aktiviert werden |
Kann aktiviert werden |
|
Standard |
Kann aktiviert werden |
Kann aktiviert werden |
|
Kann aktiviert werden |
Kann aktiviert werden |
Kann aktiviert werden |
|
Nicht verfügbar |
Nicht verfügbar |
Kann aktiviert werden |
Hinweis |
---|
Ein Beispiel über das Aktivieren von Virtualisierung und Containerwiederverwendung in einer TreeView finden Sie unter Gewusst wie: Verbessern der Leistung von TreeView. |
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Zwischenspeichern von Anwendungsdaten in einer WPF-Anwendung
Konzepte
Optimieren der Leistung: Layout und Entwurf