【发布时间】:2013-04-25 15:56:39
【问题描述】:
我在查看this question 并发现了一些非常奇怪的东西:在涉及Grid.RowSpan 的某些情况下,似乎行的高度计算不正确。
这是我正在测试的Grid 的简单绘图:
这里有一些演示该问题的 Grid 示例代码:
<Grid ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Background="Red">
<Label Content="CELL 1 A"/>
<Label Content="CELL 1 B"/>
<Label Content="CELL 1 C"/>
</StackPanel>
<Grid Grid.Column="0" Grid.Row="2" Background="CornflowerBlue">
<Label Content="CELL 2 D"/>
</Grid>
<StackPanel Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" Background="Yellow">
<Label Content="CELL 3 A"/>
<Label Content="CELL 3 B"/>
<Label Content="CELL 3 C"/>
<Label Content="CELL 3 D"/>
</StackPanel>
<Grid Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" Background="Green">
<Label Content="CELL 4"/>
</Grid>
</Grid>
最终结果是第 3 行(单元格 #2 和 #3)的高度有很多额外的空间:
如果我将第一个和第三个单元格的 Grid.RowSpan 调整 +/- 1,并将第二个和第四个单元格的 Grid.Row 调整 +/- 1 以考虑额外的行,我会得到这个(正确) 结果:
如果我从单元格 #3 中删除足够多的元素以便它可以在单个行中呈现,我也会得到正确的结果,如下所示:
奇怪的是,删除一些对象只会应用一些额外的空间
我一直在搞乱 #1 和 #3 单元格中的元素数量以及行数,但我似乎无法找到解释这种行为的结论性模式。
在渲染此 Grid 时 WPF 在幕后究竟做了什么以导致在单元格 #3 上出现Grid.RowSpan 时出现额外空间?
【问题讨论】:
-
我想说的是因为网格的测量方式不同,但我对所有堆栈面板都进行了尝试,但它的大小仍然错误。
-
“自动”行高太多。 Grid 控件在处理跨行和跨列方面做得很好,但是当所有行高都设置为“自动”时,它就像求解一个包含太多未知数的方程。将前 2 行中的 1 行或全部限制到固定高度有很大帮助。
-
@Stewbob 我也测试过将最后一行留在
Height="*",但这并没有什么不同。问题在于确定使用RowSpan的单元格的高度,与Grid如何分配额外的垂直空间无关。我已经更新了我的代码示例以包含一个*大小的行,以帮助说明这一点:) -
不是“*”,即“剩余”或“比例”空间,而是前两行中1行的实际固定值;正在跨越的那些。如果您将 RowDefinitions 中第一行的高度设置为固定值,例如“30”,它会正确调整跨度的大小。
-
@Stewbob 6 auto 在一个简单的布局上有太多的未知数。