以编程方式获取RowDefinition高度

时间:2010-03-04 22:41:56

标签: wpf

我有这个XAML:

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

我正试图像这样得到第二排的高度:

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

但是我得到了1.我尝试了ActualSize并且它也不起作用(返回0)。如何获得行的高度?

2 个答案:

答案 0 :(得分:3)

首先,Height.Value返回1的原因是Height是GridLength,GridUnitType为Star。 1来自比例星大小(例如,高度=“2 *”,高度=“3 *”等)。即你不能孤立地阅读GridLength.Value:你与GridUnitType一起阅读它。

现在到了真正的问题。在测量元素之前,WPF不计算元素的ActualHeight,它是显示传递的一部分。来自RowDefinition.ActualHeight docs

  

添加或删除行或时   列,所有的ActualWidth   ColumnDefinition元素和   所有RowDefinition的ActualHeight   在Measure为止之前,元素变为零   调用。

因此,如果您在WPF调用Measure之前尝试获取ActualHeight,则会得到0或其他一些不良结果。

幸运的是,你实际上需要才能获得ActualHeight:因为WPF会将你的对象调整到可用空间(因为星号大小),你实际上可以让对象自己处理SizeChanged事件或覆盖OnRenderSizeChanged。根据渲染的工作方式,此事件处理程序可能会更新对象的子对象集(如果对象是面板或绘图类型对象)或使用InvalidateVisual强制重新渲染(如果对象更直接地绘制 - 模式风格,例如通过重写OnRender)。

答案 1 :(得分:0)

你想做什么?

如果您尝试更改默认布局,可能需要考虑继承网格并覆盖度量并排列方法。