Frage

Ich habe Probleme zu verstehen, wann die OnRender-Methode aufgerufen wird.Betrachten Sie mein Beispiel:Ich habe eine von FrameworkElement abgeleitete Klasse SomeElement, die die OnRender-Methode überschreibt.Angenommen, ich habe eine Grid grid.Was ich erwarten würde, ist das

var someElement = new SomeElement();
grid.AddVisualChild(someElement);
someElement.InvalidateVisual();

würde dazu führen, dass die SomeElement.OnRender-Methode ausgelöst wird.In meinem Fall ist das nicht der Fall, aber das Folgende tut es:

var someElement = new SomeElement();
grid.Children.Add(new SomeElement());
someElement.InvalidateVisual();

Meine Frage ist also, warum someElement wird nicht gezeichnet, wenn es ausschließlich der visuellen Struktur hinzugefügt wird.Welche Bedeutung hat es, es der Immobilie hinzuzufügen? Children?Und allgemeiner: Wie heißt OnRender?Über den visuellen Baum, oder Children Eigentum, oder?

War es hilfreich?

Lösung

AddVisualChild macht nicht das, was Sie vielleicht denken.

AddVisualChild dient lediglich dazu, eine Kind-Eltern-Beziehung zwischen zwei Visuals in VisualTree zu erstellen.Nichts mehr und nicht weniger.VisualTree rendert nicht alles, was darin enthalten ist.

AddLogicalChild macht dasselbe, erstellt lediglich LogicalTree.LogicalTree ist normalerweise kleiner und kürzer als VisualTree, was bedeutet, dass es schneller ist.

Um die Darstellung Ihrer untergeordneten Elemente vollständig zu unterstützen, müssen Sie für sie die Methode „measure“ und die Methode „arrangement“ aufrufen.Darüber hinaus müssen Sie die VisualChildrenCount-Eigenschaft Ihres übergeordneten Elements ändern und jedem untergeordneten Element die richtige Größe übergeben und sie an der richtigen Position platzieren, damit der Benutzer sie sehen kann.Dann werden die Dinge gerendert.

Der alleinige Aufruf von AddVisualChild und InvalidateVisual führt zu nichts.

Die Kindersammlung hingegen ist eine UIElementCollection, die alle oben genannten Dinge automatisch ausführt.Deshalb funktioniert es mit Children.Add(...).

Darüber hinaus sollten Sie immer mit der Kindersammlung arbeiten, anstatt Ihre eigenen Dinge zu schreiben.

Wie HighCore bereits erwähnt hat, können viele Probleme einfach durch eine geeignete MVVM gelöst werden.

Möglicherweise benötigen Sie kein benutzerdefiniertes Steuerelement.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top