First off, the reason Height.Value returns 1 is that Height is a GridLength, with a GridUnitType of Star. The 1 is from proportional star sizing (e.g. Height="2*", Height="3*", etc.). I.e. you can't read GridLength.Value in isolation: you have to read it in conjunction with the GridUnitType.
Now to the real issue. WPF does not calculate the ActualHeight of elements until they are measured, which it does as part of the display pass. From the RowDefinition.ActualHeight docs:
When you add or remove rows or
columns, the ActualWidth for all
ColumnDefinition elements and the
ActualHeight of all RowDefinition
elements becomes zero until Measure is
called.
So if you try to get ActualHeight before WPF has called Measure, you'll get 0 or some other bad result.
Fortunately, you don't actually need to get ActualHeight: because WPF is going to size your object to the available space (because of star sizing), you can actually have the object handle its own SizeChanged event or override OnRenderSizeChanged. Depending on how your rendering works, this event handler might update the object's set of child objects (if the object is a panel- or drawing-type object) or force a re-render using InvalidateVisual (if the object draws in a more immediate-mode style e.g. by overriding OnRender).