Laden...

MeasureOverride in CustomControl wird beim erstmaligen anzeigen n-fach aufgerufen

Erstellt von Quaneu vor 8 Jahren Letzter Beitrag vor 8 Jahren 408 Views
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 8 Jahren
MeasureOverride in CustomControl wird beim erstmaligen anzeigen n-fach aufgerufen

Hallo zusammen,

ich habe ein CustomControl in dem MeasureOverride und ArrangeOverride überschrieben wurden. Des Weiteren hat das Control 9 DependencyProperties mit "AffectsMeasure" z.B. LineThickness.

Beim debuggen ist mir nun aufgefallen, dass MeasureOverride 12 mal aufgerufen wird, wenn das Control zum ersten mal angezeigt wird. Beim Scrollen auch öfter als einmal. Sollte dies nicht nur jeweils einmal passieren?

Jetzt wollte ich wissen woran dies liegen kann. Beim erstmaligen anzeigen dachte ich mir, dass alle Propertys "gesetzt" werden und somit eben auch MeasureOverride ausgelöst wird... Wobei ich dies als sehr schönes Verhalten sehen würde.

Könnte mir jemand auf die Sprünge helfen?

Schöne Grüße
Quaneu

5.299 Beiträge seit 2008
vor 8 Jahren

Wie auf die Sprünge helfen?

Sollte dies nicht nur jeweils einmal passieren? Wie's aussieht passierts halt mehrmals.

Du könntest allenfalls ein stark vereinfachtes Test-UserControl basteln, und damit herumprobieren.
Vielleicht kannst du ja näheres feststellen, unter welchen Umständen es wie oft aufgerufen wird.

Denkbar ist, dass im CustomControl ungeschickt angelegte Logik zu häufigeren Aufrufen führt.
Auch denkbar ist, dass ein besonders listiges CustomControl seine Abmasse iwie cacht, sodass auch viele MeasureOverride-Aufrufe nicht auf die Performance hauen.

Denkbar halt, eigene Erfahrung habich damit nicht.

Der frühe Apfel fängt den Wurm.

T
708 Beiträge seit 2008
vor 8 Jahren

Hi Quaneu,

genauso wie auch Resize, werden die bei praktisch jedem OnPaint des Parent Controls aufgerufen. Auch wenn sich an der Größe oder Position nichts verändert hat.
Aber das zu entscheiden liegt im Control selbst. Daher kannst Du, sofern sich nichts geändert hat, per return rausspringen oder base.MeasureOverride aufrufen.

Im Debugger kann man übrigens prima sehen, wer die Funktion aufruft! Blende Dir dazu das Fenster "Call Stack" ein.

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 8 Jahren

Ich hatte im Debugger schon geschaut woher die Aufrufe kamen, jedoch hat sie mir nicht recht geholfen.

Lattice.dll!Lattice.LatticeControl.MeasureOverride(System.Windows.Size availableSize = {System.Windows.Size}) Line 186 C#
PresentationFramework.dll!System.Windows.FrameworkElement.MeasureCore(System.Windows.Size availableSize = {System.Windows.Size}) + 0x458 bytes
PresentationCore.dll!System.Windows.UIElement.Measure(System.Windows.Size availableSize = {System.Windows.Size}) + 0x271 bytes
PresentationCore.dll!System.Windows.ContextLayoutManager.UpdateLayout() + 0x218 bytes

Diesen CallStack bekomme ich immer wieder.

Ich werde jetzt noch testen, ob es vielleicht am debuggen selber liegt.

Schöne Grüße und vielen Dank
Quaneu