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).