关于用户界面:如何在WPF中获取控件以填充可用空间?

关于用户界面:如何在WPF中获取控件以填充可用空间?

How to get controls in WPF to fill available space?

如果你没有指定它的高度,一些WPF控件(比如Button)似乎很乐意消耗它'容器中的所有可用空间。

还有一些,比如我现在需要使用的那些,(多线)TextBoxListBox似乎更担心只需占用适合其内容所需的空间,而不是更多。

如果你将这些人放在一个UniformGrid的单元格中,它们将会扩展以适应可用空间。但是,UniformGrid实例并不适合所有情况。如果你有一个网格,其中一些行设置为*高度,以划分自身与其他*行之间的高度,该怎么办?如果你有一个StackPanel并且你有一个Label,一个List和一个Button,怎么能让列表占据标签和按钮没有吃掉的所有空间呢?

我认为这真的是一个基本的布局要求,但我无法弄清楚如何让它们填充他们可以的空间(将它们放在DockPanel中并将其设置为填充也不起作用,它似乎,因为DockPanel只占用其'子控件)所需的空间。

如果您必须使用HeightWidthMinHeightMinWidth等,那么可调整大小的GUI会非常糟糕。

你可以将HeightWidth属性绑定到你占用的网格单元吗?或者还有另一种方法吗?


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

1
HorizontalContentAlignment="Stretch"

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

1
HorizontalAlignment="Stretch"

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


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

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

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

StackPanel要求每个孩子获得所需的大小,然后将它们堆叠起来。堆栈面板在每个子项上调用Measure(),可用大小Infinity,然后使用子项所需的大小。

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

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

有关简单示例,请参阅此文章。


嗯,我发布后就知道了,这是最令人尴尬的方式。 :)

看起来StackPanel的每个成员都会填充其最小请求大小。

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

我希望看到一种更优雅的方法来处理这个问题,但它会做到。


使用Horizo??ntalAlignment和VerticalAlignment布局属性。它们控制元素在可用空间多于元素所需的空间时如何使用其父元素内的空间。

例如,StackPanel的宽度将与它包含的最宽元素一样宽。因此,所有较窄的元素都有一些过剩的空间。对齐属性控制子元素对额外空间的作用。

两个属性的默认值是Stretch,因此子元素被拉伸以填充所有可用空间。其他选项包括Horizo??ntalAlignment的Left,Center和Right以及VerticalAlignment的Top,Center和Bottom。


推荐阅读