gpt4 book ai didi

wpf - 为什么这个多余的空间会出现在网格中?

转载 作者:行者123 更新时间:2023-12-04 04:38:40 25 4
gpt4 key购买 nike

我看着this question时发现了一个很奇怪的东西:在某些涉及Grid.RowSpan的情况下,行的高度似乎计算不正确。

这是我正在测试的Grid的简单图形:

---------------|   1   |     |--------|  3  ||   2   |     |---------------|      4      |---------------

And here's some sample code for this Grid that demonstrates the problem:

<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>

最终结果是第三行(单元格#2和#3)的高度中有很多额外的空间:

如果我将第一个和第三个单元格的 Grid.RowSpan调整+/- 1,并且将第二个和第四个单元格的 Grid.Row调整+/- 1以解决额外的行,我会得到以下(正确)结果:

如果我从3号单元格中删除了足够的元素,因此它也可以在单个Row中呈现,那么我也会得到正确的结果,如下所示:

奇怪的是,删除一些对象只会导致应用一些额外的空间

我一直在搞弄#1和#3单元格中的元素数量以及行数,但是我似乎无法找出一种确定的模式来解释这种行为。

当渲染此Grid导致在单元格3上的 Grid.RowSpan出现额外的空间时,WPF在幕后到底在做什么?

最佳答案

我以前就遇到过这种情况,就像my question here中关于多余空间appearing in a ListView的情况一样

根据我从Microsoft员工那里得到的答复:

The bug involves a step in VSP’s Measure algorithm that remembers the largest size ever discovered and forces all future Measure calls to report a size at least as large. In your case, the VSP is initially measured before any triggers have fired, so it computes the size as if everything were visible. When the triggers fire and collapse the buttons, the measure algorithm computes the correct (small) size, but then forces the result to be large again.



网格的行为看起来与我的Virtualizing Stack Panel的行为类似: RowDefinition的Measure调用正在发生某些事情,这迫使它记住并始终报告较大的大小,即使稍后在行中较小的大小也会会更好。

简而言之,您可能在WPF中发现了一个错误,因为存在多种解决方法(将已定义的行总数与所需的总数相匹配,重新排列网格,等等...)可能永远不会引起注意。您只能通过打开Microsoft Connect错误并等待其答复来确认或驳斥此问题。

关于wpf - 为什么这个多余的空间会出现在网格中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16321763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com