【发布时间】:2018-08-07 11:26:18
【问题描述】:
我已经连续两天在这个问题上,仍然无法弄清楚!请帮忙!
我想做的事情似乎比较简单。我有一个带有网格的窗口。共有三行:一行“自动”,一组用于填充剩余空间,另一行设置为“自动”,具有最大高度。这是 xaml:
<Grid Name="theGrid" >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="Auto" MaxHeight="300"></RowDefinition>
</Grid.RowDefinitions>
<ContentControl Grid.Row="0" Content="{Binding fixedLabel}"></ContentControl>
<ContentControl Grid.Row="1" Content="{Binding bigLabel}"></ContentControl>
<ContentControl Grid.Row="2" Content="{Binding gridWithStackPanel}"></ContentControl>
</Grid>
前两行只有一个简单的标签。第三行本身由一个网格组成。这是一个简单的网格,有两行,一排可以填充剩余空间,另一排标记为“自动”。这是该网格的 xaml:
<Grid Name="theGrid" Style="{StaticResource BasePGOGridStyle}">
<Grid.RowDefinitions>
<RowDefinition Height="1*"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<ContentControl Grid.Row="0" Content="{Binding stackPanel}"></ContentControl>
<ContentControl Grid.Row="1" Content="{Binding simpleLabel}"></ContentControl>
</Grid>
所需的行为很简单:第二个网格将有一个堆栈面板作为其顶部项目,底部有一个简单的标签。但是,如果堆栈面板有很多项目,它只会炸掉底部的标签。尽管设置为“自动”,但 WPF 似乎并未为“simpleLabel”保留空间。
似乎正在发生的事情是 WPF 告诉第二个网格“嘿,您在父网格中被标记为 'Auto',所以占用尽可能多的空间”。因此,第二个网格的布局就好像它有很多空间一样,显示了堆栈面板中的所有项目。然后,WPF 似乎在说,“等一下,你的父行有一个 maxHeight 值,所以你需要自己剪辑”。最终发生的是“simpleLabel”然后从布局中删除。
这是我对正在发生的事情的最佳猜测,但也许还有其他事情发生。我进行了广泛的研究,但找不到解决问题的方法。我真的是唯一一个在具有 MaxHeight 的网格中放置网格的人吗?这似乎是 WPF 功能的基本部分。
如果您有任何想法,请告诉我!
【问题讨论】:
-
这是 StackPanel 本身。它忽略了它的父母告诉它的可用空间是什么,只是占据了它的孩子想要的所有空间。使用其他面板,例如 DockPanel,或将其放入 ScrollViewer。
-
感谢您的评论,但这不是问题所在。如果我将 StackPanel 放在 ScrollViewer 中,滚动条就会超出窗口布局。此外,如果放置在具有“自动”高度的网格中,则 StackPanel 不会自动将其他所有内容吹出。在这种情况下这样做是因为与它的父网格行发生了一些奇怪的交互。