为什么 WPF 组合框高度会展开以填充网格单元格,而不是在 StackPanel 中



这是扩展以填充整个网格单元格的代码:

<ComboBox Grid.Column="3" Grid.Row="1" >
  <ComboBoxItem>text1</ComboBoxItem>
  <ComboBoxItem>text2</ComboBoxItem>
  <ComboBoxItem>text3</ComboBoxItem>
  <ComboBoxItem>text4</ComboBoxItem>
</ComboBox>

但是当我把它放在网格单元格内的堆栈面板中时,它不会扩展。

<StackPanel  Grid.Column="3" Grid.Row="1" Margin="10">
  <ComboBox>
    <ComboBoxItem>text1</ComboBoxItem>
    <ComboBoxItem>text2</ComboBoxItem>
    <ComboBoxItem>text3</ComboBoxItem>
    <ComboBoxItem>text4</ComboBoxItem>
  </ComboBox>
</StackPanel>

是什么导致组合框填充到上面第一个代码中网格单元格的高度?

作为跟进,我们通常是否必须为 ComboBox 设置特定的宽度,或者除了锁定宽度或高度之外,还有其他更好的方法吗?

Grid 和 StackPanel 的行为不同。

默认情况下,控件的水平对齐和垂直对齐将为"拉伸"。实际上,网格的行为是将控制扩展到整个单元。但是,StackPanel 旨在将控件放在彼此之下(如果方向为垂直(。因此,在这种情况下,它忽略了"拉伸"垂直对齐。不过,它确实遵循水平对齐。

所以恐怕答案很简单"这就是StackPanel的工作方式"。如果需要拉伸,则需要不同的控件,例如 Grid 或 UniformGrid。

对于宽度,这取决于您的设计。通常,您会使用边距,最小宽度和最大宽度(或高度(的某种组合来获得所需的外观。

是什么导致组合框填充到上面第一个代码中网格单元格的高度?

不同的

面板具有不同的特性。

Grid拉伸其子元素以填充可用空间,而StackPanel则不拉伸。请参阅以下问题 有关此内容的更多信息。

为什么 StackPanel 不垂直拉伸其子项?

因此,在您的示例中,Grid使StackPanel本身填充可用空间,但StackPanel反过来不会使ComboBox填充其可用空间。

可以通过将StackPanelBackground 属性设置为某个画笔来确认这一点。然后,您将看到此画笔的颜色填充了Grid的整个单元格。

除非我弄错了,否则我似乎已经在 StackPanel 上设置了一个单一的边距,默认情况下,这会将所有 4 个边距同时设置为该值。这将阻止它填充网格单元格

因为StackPanelMeasureOverride会将面板的呈现大小限制为呈现其子控件所需的最小值。

在您的情况下,它会停止ComboBox填充单元格。

最新更新