如何在WPF中获取控件来填充可用空间?

有些WPF控件(如Button )似乎很高兴地使用它的容器中的所有可用空间,如果你没有指定它的高度。

还有一些,就像我现在需要使用的那些,(多行) TextBoxListBox似乎更担心只是为了适应其内容而需要的空间,而没有更多。

如果你把这些家伙放在UniformGrid一个单元格中,它们将会展开以适应可用的空间。 但是, UniformGrid实例并不适合所有情况。 如果你有一个网格,一些行设置为*高度来划分本身和其他*行之间的高度? 如果你有一个StackPanel并且你有一个Label ,一个List和一个Button ,那你怎么能得到这个列表来占用所有没有被标签和button所占用的空间呢?

我会认为这将是一个基本的布局要求,但我不知道如何让他们填补他们可能的空间(把他们放在一个DockPanel并设置它填充也行不通,看来,因为DockPanel只占用其子控制所需的空间。

如果你必须玩HeightWidthMinHeightMinWidth等等,一个可resize的GUI将是非常可怕的。

你可以绑定你的HeightWidth属性到你占据的网格单元? 还是有另一种方法来做到这一点?

Panel派生的每个控件都实现了在Measure()Arrange()执行的不同的布局逻辑:

  • Measure()确定面板及其每个子级的大小
  • Arrange()确定每个控件呈现的矩形

DockPanel的最后一个孩子填充剩余的空间。 您可以通过将LastChild属性设置为false来禁用此行为。

StackPanel询问每个孩子所需的大小,然后堆叠它们。 堆栈面板在每个子项上调用Measure() ,并使用Infinity的可用大小,然后使用子项的所需大小。

Grid占用所有可用空间,但是,它会将每个孩子设置为所需的大小,然后将其置于单元中。

您可以通过从Panel派生,然后重写MeasureOverride()ArrangeOverride()来实现自己的布局逻辑。

看一个简单的例子这篇文章 。

还有一些属性可以设置为强制控件填充其可用空间,否则就不会这样做。 例如,你可以说:

 HorizontalContentAlignment="Stretch" 

…强制控件的内容水平拉伸。 或者你可以说:

 HorizontalAlignment="Stretch" 

…强制控制本身水平伸展以填充其父项。

那么,我发现自己,发布后,这是最尴尬的方式。 🙂

看来StackPanel的每个成员都会简单地填充它的最小请求大小。

在DockPanel中,我按照错误的顺序停靠了东西。 如果文本框或列表框是唯一没有alignment的停靠项目,或者它们是最后添加的项目,它们将根据需要填充剩余的空间。

我很想看到处理这个更优雅的方法,但它会做的。

使用Horizo​​ntalAlignmentVerticalAlignment布局属性。 它们控制元素如何使用元素所需的空间时,元素使用其父元素中的空间的方式。

例如,一个StackPanel的宽度将和它所包含的最宽的元素一样宽。 所以,所有较窄的元素都有一些额外的空间。 alignment属性控制子元素对多余空间的操作。

这两个属性的默认值是Stretch,所以子元素被拉伸以填充所有可用空间。 其他选项包括水平alignment的左,中和右, 垂直alignment的顶端,中间和底端。