3 Stimmen

Höhe der RowDefinition programmatisch abrufen

Ich habe diese XAML:

<Grid Background="LightYellow" Height="150" Width="150">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
</Grid>

Und ich versuche, die Höhe der zweiten Reihe so zu erhalten:

height = grid.RowDefinitions[1].Height.Value;

Aber ich erhalte eine 1. Ich habe es mit ActualSize versucht und es funktioniert auch nicht (gibt 0 zurück). Wie kann ich die Höhe der Zeile ermitteln?

3voto

itowlson Punkte 72130

Zunächst einmal ist der Grund dafür, dass Height.Value 1 zurückgibt, dass Height eine GridLength ist, mit einem GridUnitType von Star. Die 1 ergibt sich aus der proportionalen Sterngröße (z.B. Height="2*", Height="3*", etc.). D.h. Sie können GridLength.Value nicht isoliert lesen: Sie haben um sie in Verbindung mit dem GridUnitType zu lesen.

Nun zum eigentlichen Thema. WPF berechnet nicht die ActualHeight von Elementen, bis sie gemessen werden, die es als Teil der Anzeige Pass tut. Von der RowDefinition.ActualHeight Dokumente :

Wenn Sie Zeilen oder Spalten hinzufügen oder entfernen Spalten hinzufügen oder entfernen, wird die ActualWidth für alle ColumnDefinition-Elemente und die ActualHeight für alle RowDefinition Elemente zu Null, bis Measure aufgerufen wird.

Wenn Sie also versuchen, ActualHeight zu erhalten, bevor WPF Measure aufgerufen hat, werden Sie 0 oder ein anderes schlechtes Ergebnis erhalten.

Zum Glück müssen Sie nicht wirklich brauchen um ActualHeight zu erhalten: da WPF Ihr Objekt auf den verfügbaren Platz (aufgrund der Sterngröße) vergrößern wird, können Sie das Objekt tatsächlich sein eigenes SizeChanged-Ereignis behandeln lassen oder OnRenderSizeChanged überschreiben. Je nachdem, wie Ihr Rendering funktioniert, könnte dieser Event-Handler die Menge der Kindobjekte des Objekts aktualisieren (wenn das Objekt ein Panel- oder Zeichnungsobjekt ist) oder ein neues Rendering mit InvalidateVisual erzwingen (wenn das Objekt in einem direkteren Stil zeichnet, z. B. durch Überschreiben von OnRender).

0voto

Danny Varod Punkte 16437

Was wollen Sie damit erreichen?

Wenn Sie versuchen, das Standardlayout zu ändern, sollten Sie erwägen, vom Raster zu erben und die Methoden measure und arrange zu überschreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X