Optimieren der Leistung: Layout und Entwurf

Der Entwurf Ihrer WPF-Anwendung kann die Leistung durch unnötigen Mehraufwand aufgrund der Berechnung des Layouts und der Überprüfung von Objektverweisen beeinträchtigen. Das Erstellen von Objekten, insbesondere zur Laufzeit, kann sich auf die Leistungsmerkmale Ihrer Anwendung auswirken.

In diesem Thema erhalten Sie Empfehlungen bezüglich der Leistung in diesen Bereichen.

Layout

Der Begriff „Layoutdurchlauf“ beschreibt den Prozess des Messens und Anordnens von Membern einer von Panel abgeleiteten Auflistung untergeordneter Elemente, die anschließend auf dem Bildschirm dargestellt werden. Ein Layoutdurchlauf ist ein mathematisch aufwändiger Prozess; je mehr untergeordnete Elementen sich in der Auflistung befinden, desto mehr Berechnungen sind erforderlich. Jedes Mal, wenn ein untergeordnetes UIElement-Objekt in der Auflistung z. B. seine Position ändert, kann es einen neuen Durchlauf des Layoutsystems auslösen. Aufgrund der engen Verbindung zwischen den Merkmalen des Objekts und dem Layoutverhalten ist es unumgänglich, den Ereignistyp zu verstehen, der das Layoutsystem aufrufen kann. Die Leistung Ihrer Anwendung wird optimiert, wenn Sie unnötige Aufrufe des Layoutdurchlaufs so weit wie möglich reduzieren.

Das Layoutsystem führt zwei Durchläufe für jeden untergeordneten Member in einer Auflistung durch: einen Messdurchlauf und einen Anordnungsdurchlauf. Jedes untergeordnete Objekt verfügt über seine eigene überschriebene Implementierung der Methoden Measure und Arrange für sein eigenes spezifisches Layoutverhalten. Ganz einfach ausgedrückt bedeutet dies, dass Layout ein rekursives System ist, das die Größe und Position eines Elements anpasst und dieses auf dem Bildschirm zeichnet.

  • Der Layoutprozess eines untergeordneten UIElement-Objekts beginnt mit der Messung von dessen Kerneigenschaften.

  • Dabei werden die FrameworkElement-Eigenschaften des Objekts ausgewertet, die sich auf die Größe beziehen, wie z. B. Width, Height und Margin.

  • Außerdem wird Panel-spezifische Logik angewandt, z. B. die Dock-Eigenschaft des DockPanel-Objekts oder die Orientation-Eigenschaft des StackPanel-Objekts.

  • Nachdem alle untergeordneten Objekte ausgemessen wurden, wird der Inhalt angeordnet oder positioniert.

  • Die Auflistung der untergeordneten Objekte wird auf dem Bildschirm dargestellt.

Der Layoutdurchlauf wird erneut aufgerufen, wenn eine der folgenden Aktionen ausgeführt wird:

  • Ein untergeordnetes Objekt wird der Auflistung hinzugefügt.

  • Auf das untergeordnete Objekt wird eine LayoutTransform angewandt.

  • Die UpdateLayout-Methode wird für das untergeordnete Objekt aufgerufen.

  • Wenn sich der Wert einer Abhängigkeitseigenschaft ändert, die mit Metadaten markiert ist, die die Messungs- oder Anordnungsdurchläufe beeinflussen

Verwenden Sie das effizienteste Panel soweit möglich

Die Komplexität des Layoutprozesses steht in direkter Beziehung zum Layoutverhalten der von Panel abgeleiteten Elemente, die Sie verwenden. Zum Beispiel stellt ein Grid-Steuerelement oder ein StackPanel-Steuerelement mehr Funktionen bereit als ein Canvas-Steuerelement. Für diese erhöhte Funktionalität büßen Sie an Leistung ein. Wenn Sie jedoch die Funktionalität eines Grid-Steuerelements gar nicht benötigen, sollten Sie weniger leistungsaufwendige Alternativen verwenden, z. B. ein Canvas-Steuerelement oder ein benutzerdefiniertes Panel.

Weitere Informationen finden Sie unter Übersicht über Panel-Elemente.

Aktualisieren Sie RenderTransform, statt es zu ersetzen

Möglicherweise können Sie Transform aktualisieren, statt es als Wert der RenderTransform-Eigenschaft zu ersetzen. Dies gilt besonders für Szenarios mit Animation. Wenn Sie eine vorhandene Transform aktualisieren, verhindern Sie damit das Initiieren einer unnötigen Layoutberechnung.

Erstellen Sie Ihre Struktur von oben nach unten

Wenn der logischen Struktur ein Knoten hinzugefügt oder dieser entfernt wird, werden Eigenschafteninvalidierungen auf dem übergeordneten und allen untergeordneten Elementen des Knotens ausgelöst. Demzufolge sollte immer ein Oben-nach-unten-Erstellmuster eingehalten werden, um unnötige Invalidierungen auf Knoten zu verhindern, die bereits validiert wurden. In der folgenden Tabelle werden die Unterschiede in der Ausführungsgeschwindigkeit zwischen dem Erstellen einer Von-oben-nach-unten- und einer Von-unten-nach-oben-Struktur veranschaulicht, wobei die Struktur 150 Ebenen mit jeweils einem einzelnen TextBlock und DockPanel auf jeder Ebene aufweist.

Aktion Strukturerstellung (in ms) Rendern, einschließlich Strukturerstellung (in ms)
Unten-nach-oben 366 454
Oben-nach-unten 11 96

Im folgenden Code wird veranschaulicht, wie Sie eine Struktur von oben nach unten erstellen können.

private void OnBuildTreeTopDown(object sender, RoutedEventArgs e)
{
    TextBlock textBlock = new TextBlock();
    textBlock.Text = "Default";

    DockPanel parentPanel = new DockPanel();
    DockPanel childPanel;

    myCanvas.Children.Add(parentPanel);
    myCanvas.Children.Add(textBlock);

    for (int i = 0; i < 150; i++)
    {
        textBlock = new TextBlock();
        textBlock.Text = "Default";
        parentPanel.Children.Add(textBlock);

        childPanel = new DockPanel();
        parentPanel.Children.Add(childPanel);
        parentPanel = childPanel;
    }
}
Private Sub OnBuildTreeTopDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim textBlock As New TextBlock()
    textBlock.Text = "Default"

    Dim parentPanel As New DockPanel()
    Dim childPanel As DockPanel

    myCanvas.Children.Add(parentPanel)
    myCanvas.Children.Add(textBlock)

    For i As Integer = 0 To 149
        textBlock = New TextBlock()
        textBlock.Text = "Default"
        parentPanel.Children.Add(textBlock)

        childPanel = New DockPanel()
        parentPanel.Children.Add(childPanel)
        parentPanel = childPanel
    Next i
End Sub

Weitere Informationen zu der logischen Struktur finden Sie unter Strukturen in WPF.

Weitere Informationen