我有这个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)。如何获得行的高度?
答案 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)
你想做什么?
如果您尝试更改默认布局,可能需要考虑继承网格并覆盖度量并排列方法。