Во-первых, причина, по которой Height.Value возвращает 1, заключается в том, что Height - это GridLength с GridUnitType of Star. 1 соответствует пропорциональному размеру звезды (например, высота = "2 *", высота = "3 *" и т. Д.). То есть вы не можете читать GridLength.Value изолированно: у вас есть для чтения вместе с GridUnitType.
Теперь к реальной проблеме. WPF не вычисляет ActualHeight элементов, пока они не будут измерены, что он делает как часть прохода отображения. Из документов RowDefinition.ActualHeight :
При добавлении или удалении строк или
столбцы, ActualWidth для всех
Элементы ColumnDefinition и
ActualHeight of RowDefinition
элементы становятся равными нулю, пока мера не станет
называется.
Так что, если вы попытаетесь получить ActualHeight до того, как WPF вызовет Measure, вы получите 0 или какой-то другой плохой результат.
К счастью, на самом деле не нужно , чтобы получить ActualHeight: поскольку WPF собирается изменить размер вашего объекта на доступное пространство (из-за размера звезды), вы можете на самом деле обрабатывать объект своим собственным SizeChanged. событие или переопределить OnRenderSizeChanged. В зависимости от того, как работает рендеринг, этот обработчик событий может обновить набор дочерних объектов объекта (если объект является объектом типа панели или рисунка) или принудительно выполнить повторный рендеринг с использованием InvalidateVisual (если объект рисуется в более непосредственном режиме). стиль режима, например, путем переопределения OnRender).