为什么WPF ComboBox高度扩展以填充网格单元格,而不是StackPanel?

时间:2017-03-16 22:22:25

标签: wpf 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>

但是当我将它放在Grid单元格内的StackPanel中时,它不会扩展。

{{1}}

是什么原因导致ComboBox在上面的第一个代码中填充到网格单元格的高度?

作为一个跟进,我们通常要为ComboBox设置一个特定的宽度,还是除了锁定宽度或高度之外还有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

Grid和StackPanel的行为不同。

默认情况下,控件的Horizo​​ntalAlignment和VerticalAlignment将为“Stretch”。网格的行为实际上是将控制范围扩展到整个单元格。但是,StackPanel旨在将控件放在另一个之下(如果Orientation为Vertical)。因此,在这种情况下,它会忽略“拉伸”VerticalAlignment。但它确实遵循了Horizo​​ntalAlignment。

所以我担心答案就是“这就是StackPanel的工作原理”。如果你需要拉伸,你需要一个不同的控件,比如Grid或UniformGrid。

对于宽度,这取决于您的设计。通常你会使用Margin,MinWidth和MaxWidth(或Height)的某种组合来获得你想要的外观。

答案 1 :(得分:1)

  

是什么原因导致ComboBox在上面的第一个代码中填充到网格单元格的高度?

不同的面板具有不同的特征。

Grid拉伸其子元素以填充可用空间,而StackPanel则不会。请参考以下问题了解更多相关信息。

Why StackPanel does not stretch its children vertically?

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

您可以通过将Background的{​​{1}}属性设置为某个画笔来确认。然后,您将看到此画笔的颜色填充StackPanel的整个单元格。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

因为StackPanel的{​​{1}}会将面板的渲染大小限制为渲染其子控件所需的最小值。

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