Die Panels, die Sie erwähnen, sind Layout-Panels. Ein kurzer Überblick über das Layout-System legt daher nahe, dass es sich wahrscheinlich nicht nur um eine einfache Liste der effizientesten Panels handelt, sondern auch darum, wie Sie die Panels verwenden, die den größten Einfluss auf Effizienz und Leistung haben.
LayoutSystem_Übersicht :
Im einfachsten Fall ist das Layout ein rekursives System, das dazu führt, dass ein Element dimensioniert, positioniert und gezeichnet wird. Insbesondere beschreibt das Layout den Prozess des Messens und Anordnens der Mitglieder der Children-Sammlung eines Panel-Elements. Layout ist ein intensiver Prozess. Je größer die Children-Sammlung ist, desto mehr Berechnungen müssen durchgeführt werden. Komplexität kann auch basierend auf dem Layoutverhalten eingeführt werden, das durch das Panel-Element definiert wird, dem die Sammlung gehört. Ein relativ einfaches Panel wie Canvas kann eine deutlich bessere Leistung aufweisen als ein komplexeres Panel wie Grid.
Jedes Mal, wenn ein untergeordnetes UIElement seine Position ändert, kann es einen neuen Durchgang durch das Layoutsystem auslösen. Daher ist es wichtig, die Ereignisse zu verstehen, die das Layoutsystem aufrufen können, da ein unnötiger Aufruf zu einer schlechten Anwendungsleistung führen kann. Im Folgenden wird der Prozess beschrieben, der beim Aufrufen des Layoutsystems auftritt.
1. Ein untergeordnetes UIElement beginnt den Layoutprozess, indem zunächst seine Kerneigenschaften gemessen werden.
2. In FrameworkElement definierte Größeneigenschaften werden ausgewertet, z. B. Breite, Höhe und Rand.
3. Es wird eine Panel-spezifische Logik angewendet, z. B. Dock-Richtung oder Stapelausrichtung.
4. Der Inhalt wird angeordnet, nachdem alle Kinder gemessen wurden.
5. Die Sammlung Kinder wird auf dem Bildschirm gezeichnet.
6. Der Prozess wird erneut aufgerufen, wenn der Auflistung zusätzliche untergeordnete Elemente hinzugefügt, eine LayoutTransform angewendet oder die UpdateLayout-Methode aufgerufen wird.
Weitere Informationen zum Messen und Anordnen von Kindern finden Sie unter LayoutSystem_Measure_Arrange
LayoutSystem_Performance :
Layout ist ein rekursiver Prozess. Jedes untergeordnete Element in einer untergeordneten Auflistung wird bei jedem Aufruf des Layoutsystems verarbeitet. Daher sollte das Auslösen des Layoutsystems vermieden werden, wenn dies nicht erforderlich ist. Die folgenden Überlegungen können Ihnen dabei helfen, eine bessere Leistung zu erzielen.
Beachten Sie, welche Änderungen des Eigenschaftswerts eine rekursive Aktualisierung durch das Layoutsystem erzwingen.
Abhängigkeitseigenschaften, deren Werte dazu führen können, dass das Layoutsystem initialisiert wird, sind mit öffentlichen Flags gekennzeichnet. AffectsMeasure und AffectsArrange liefern nützliche Hinweise darauf, welche Änderungen des Eigenschaftswerts eine rekursive Aktualisierung durch das Layoutsystem erzwingen. Im Allgemeinen sollte für jede Eigenschaft, die sich auf die Größe des Begrenzungsrahmens eines Elements auswirken kann, das AffectsMeasure-Flag auf true gesetzt sein. Weitere Informationen finden Sie unter Übersicht über Abhängigkeitseigenschaften.
Verwenden Sie nach Möglichkeit eine RenderTransform anstelle einer LayoutTransform.
Eine LayoutTransform kann eine sehr nützliche Methode sein, um den Inhalt einer Benutzeroberfläche zu beeinflussen. Wenn sich der Effekt der Transformation jedoch nicht auf die Position anderer Elemente auswirken muss, verwenden Sie stattdessen am besten eine RenderTransform, da RenderTransform das Layoutsystem nicht aufruft. LayoutTransform wendet seine Transformation an und erzwingt eine rekursive Layoutaktualisierung, um die neue Position des betroffenen Elements zu berücksichtigen.
Vermeiden Sie unnötige Aufrufe von UpdateLayout.
Die UpdateLayout-Methode erzwingt eine rekursive Layoutaktualisierung und ist häufig nicht erforderlich. Wenn Sie nicht sicher sind, dass ein vollständiges Update erforderlich ist, verlassen Sie sich auf das Layoutsystem, um diese Methode für Sie aufzurufen.
Wenn Sie mit einer großen Children-Sammlung arbeiten, sollten Sie ein VirtualizingStackPanel anstelle eines regulären StackPanel verwenden.
Durch die Virtualisierung der untergeordneten Sammlung speichert das VirtualizingStackPanel nur Objekte im Speicher, die sich derzeit im ViewPort des übergeordneten Elements befinden. Infolgedessen wird die Leistung in den meisten Szenarien erheblich verbessert.
Optimieren der Leistung: Layout und Design : Dieser Artikel beschreibt ausführlich, wie der Baum effizient erstellt werden kann, und enthält eine einfache Liste der Bedienfelder, die auf ihrer Komplexität basieren
Canvas (am wenigsten komplex = effizienter und leistungsfähiger)
Gitter
Andere Panels (komplexer = weniger effizient und schlechtere Leistung)
Weitere zu berücksichtigende Leistungsaspekte: Möglichkeiten zur Verbesserung der Rendergeschwindigkeit der WPF-Benutzeroberfläche
- Alles zwischenspeichern. Pinsel, Farben, Geometrien, formatierte Texte, Glyphen. (Zum Beispiel haben wir zwei Klassen: RenderTools und TextCache. Der Renderprozess jeder Einheitenadresse an die gemeinsam genutzte Instanz beider Klassen. Wenn also zwei Diagramme denselben Text haben, wird ihre Vorbereitung nur einmal ausgeführt.)
- Freeze Freezable, wenn Sie es längere Zeit verwenden möchten. Besonders Geometrien. Komplexe nicht gefrorene Geometrien führen HitTest extrem langsam aus.
- Wählen Sie die schnellsten Möglichkeiten zum Rendern jedes Grundelements. Zum Beispiel gibt es ungefähr 6 Möglichkeiten zum Rendern von Text, aber die schnellste ist DrawingContext.DrawGlyphs.
- Container-Recycling aktivieren. Die Virtualisierung bringt viele Leistungsverbesserungen mit sich, aber die Container werden entsorgt und neu erstellt. Dies ist die Standardeinstellung. Sie können jedoch mehr Leistung erzielen, indem Sie Container recyceln, indem Sie VirtualizingStackPanel.VirtualizationMode = "Recycling" festlegen.
- Von hier aus : Es gibt keine praktische Begrenzung für die Verschachtelung, die Ihre Anwendung unterstützen kann. Im Allgemeinen ist es jedoch am besten, Ihre Anwendung so zu beschränken, dass nur die Bereiche verwendet werden, die für Ihr gewünschtes Layout tatsächlich erforderlich sind. In vielen Fällen kann ein Rasterelement aufgrund seiner Flexibilität als Layoutcontainer anstelle verschachtelter Bedienfelder verwendet werden. Dies kann die Leistung in Ihrer Anwendung steigern, indem unnötige Elemente aus dem Baum ferngehalten werden.