Laden...

WPF Control - Erst neu zeichnen wenn SizeChanged "vorbei" ist

Erstellt von Palladin007 vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.451 Views
Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 6 Jahren
WPF Control - Erst neu zeichnen wenn SizeChanged "vorbei" ist

Guten Abend,

ich habe ein Control, das im neu Zeichnen recht aufwendig ist.
Wenn ich das Fenster nun in der Größe verändere, sieht man schön, wie dieses Control gezeichnet wird.
Ich vermute, dass das an einigen Grids liegt, die per SharedSizeGroup aufeinander achten und sich untereinander "abstimmen" müssen. Das sind mehrere Grids übereinander, die zusammen ein Gesamtbild bieten. Die enthalten selber wieder einige Grids, die aber alle die selben flexiblen (ergeben sich aus den Inhalten) Maße brauchen, damit alles passt.

Natürlich kann ich jetzt viel Zeit drauf werfen, das performanter zu machen (z.B. selber zeichnen), ich würde es aber lieber schnell und einfach haben 😄

Wer schon jetzt einen einfachen Weg weiß, wie ich das "abstimmen" zwischen Grids beschleunigen kann, das wäre natürlich perfelt ^^

Mein Gedanke war:
Kann ich ein Control (und alle logical childs) "verbieten" sich neu zuzeichnen, wenn das Control in der Größe verändert wird?
Ich müsste dann manuell InvalidateVisual aufrufen, wenn z.B. der Benutzer mit dem groß/klein ziehen aufgehört hat.

Zusätzlich wäre auch schön, wenn die Ansicht sich erst verändert, wenn das Zeichnen auch komplett abgeschlossen ist. Bis dahin ändert sich die View einfach nicht.

Kann ich das irgendwie erreichen, oder gibt es bereits einen Weg dafür?

Beste Grüße und schon mal vielen Dank

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

D
985 Beiträge seit 2014
vor 6 Jahren

Nein, verbieten kann man das denen nicht (oder wenn dann nur dreckig).

Aber man kann den Controls vorgaukeln, das alles noch beim Alten ist, trotz Größenänerung des UserControls.

In der Regel sieht ein UserControl so aus (vereinfachte Darstellung):


<UserControl>
  <Grid>
  </Grid>
</UserControl>

Das Grid-Control breitet sich automatisch über die gesamte Fläche des UserControls aus und folgt auch den Größenänderungen.

Gibt man dem Grid aber eine feste Größe ... dann wirken sich die Größenänderungen vom Control nicht mehr auf das Grid (und alle darin enthaltenen Child-Controls) aus.

Jetzt braucht man nur noch eine kleine Logik, die das Grid immer der Größe des Controls folgen lässt. Wann man diese aufruft, bleibt einem dann selber überlassen. 😉

Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 6 Jahren

Hm, gute Idee

Eigentlich konnte man daraus ja auch einen Wrapper oder Behavior bauen, der diese Funktionalität mit sich bringt.

Ich hab bei mir durch Zufall auch den großen Zeitfresser gefunden.
Das war eine ColumnDefinition der übereinander liegenden Grids, die eine SharedSizeGroup hatte.
Da die Columns sowieso immer gleich groß sein müssen, kann ich die Breite auch binden.
Hab ich raus gefunden, als ich testen wollte, die es sich verhält, wenn ich von Auto auf * ändere 😄

So eine Art LazyResizeBehavior werde ich aber trotzdem mal bauen.
Ist an der einen oder anderen Stelle sicher ganz praktisch und die View muss ja nicht jeden einzelnen Pixel mit resizen und alles anpassen. ^^

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.