如何让控件在WPF填补可用的空间?

一些WPF控件(如Button)如果你不指定它的高度,它似乎会愉快地消耗其容器中的所有可用空间。

还有一些,就像我现在需要使用的,(multiline) TextBoxListBox似乎更担心只占用必要的空间来容纳它们的内容,而不是更多。

如果你把这些东西放在UniformGrid的单元格中,它们会扩展以适应可用空间。然而,UniformGrid实例并不适用于所有情况。如果您有一个网格,其中一些行设置为* height,以在自身和其他*行之间划分高度,该怎么办?如果你有一个StackPanel,你有一个Label,一个List和一个Button,你怎么能让列表占据所有没有被标签和按钮占用的空间?

我认为这真的是一个基本的布局要求,但我不知道如何让他们填补空间,他们可以(把他们放在DockPanel并设置为填充也不工作,似乎,因为DockPanel只占用它的'子控件所需的空间)。

如果你必须使用HeightWidthMinHeightMinWidth等,那么可调整大小的GUI将非常可怕。

你能将你的HeightWidth属性绑定到你所占用的网格单元格吗?或者还有别的办法吗?

314819 次浏览

我自己想出来的,刚发完帖子,这是最尴尬的方式。:)

似乎StackPanel的每个成员都会填满它所要求的最小大小。

在DockPanel中,我以错误的顺序停靠了东西。如果TextBox或ListBox是唯一没有对齐的停靠项,或者如果它们是最后添加的,它们将填充所需的剩余空间。

我希望看到一种更优雅的方法来处理这个问题,但它已经足够了。

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

HorizontalContentAlignment="Stretch"

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

HorizontalAlignment="Stretch"

... 强制控件本身水平拉伸以填充其父控件。

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

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

DockPanel的最后一个子元素填充剩余的空间。你可以通过将LastChild属性设置为false来禁用这种行为。

StackPanel请求每个子对象所需的大小,然后将它们堆叠起来。堆栈面板在每个子节点上调用Measure(),其可用大小为Infinity,然后使用子节点所需的大小。

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

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

一个简单的例子见这篇文章

使用HorizontalAlignmentVerticalAlignment布局属性。它们控制一个元素在其父元素中所拥有的空间大于该元素所需的空间时如何使用该空间。

例如,StackPanel的宽度将与它所包含的最宽元素一样宽。所以,所有较窄的元素都有一些多余的空间。对齐属性控制子元素如何处理额外的空格。

这两个属性的默认值都是Stretch,因此子元素被拉伸以填充所有可用空间。其他选项包括HorizontalAlignment的左、中、右,VerticalAlignment的上、中、下。