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

还有一些,比如我现在需要使用的(多行) TextBoxListBox 似乎更担心只占用适合内容的必要空间,仅此而已。

如果你把这些人关在牢房里 UniformGrid, ,它们将扩展以适应可用空间。然而, UniformGrid 实例并不适合所有情况。如果您有一个网格,其中某些行设置为 * 高度以将其高度除以自身和其他 * 行之间的高度,该怎么办?如果你有一个怎么办 StackPanel 你有一个 Label, , A List和一个 Button, ,如何才能让列表占据所有未被标签和按钮占用的空间呢?

我认为这确实是一个基本的布局要求,但我不知道如何让它们填充它们可以填充的空间(将它们放在一个 DockPanel 并且将其设置为 fill 似乎也不起作用,因为 DockPanel 仅占用其子控件所需的空间)。

如果你不得不玩的话,一个可调整大小的 GUI 将是非常可怕的 Height, Width, MinHeight, MinWidth ETC。

可以绑定你的吗 HeightWidth 您占据的网格单元的属性?或者还有其他方法可以做到这一点吗?

有帮助吗?

解决方案

每个控件都源自 Panel 实现不同的布局逻辑 Measure()Arrange():

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

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

StackPanel 询问每个孩子想要的尺寸,然后将它们堆叠起来。堆栈面板调用 Measure() 每个孩子的可用大小为 Infinity 然后使用孩子想要的尺寸。

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

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

本文 举一个简单的例子。

其他提示

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

HorizontalContentAlignment="Stretch"

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

HorizontalAlignment="Stretch"

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

好吧,我自己想出来了,发完帖后,这是最尴尬的方式。:)

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

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

我很想看到一种更优雅的方法来处理这个问题,但它就可以了。

使用 水平对齐垂直对齐 布局属性。当可用空间多于元素所需的空间时,它们控制元素如何使用其父级内部的空间。

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

这两个属性的默认值都是 Stretch,因此子元素会拉伸以填充所有可用空间。其他选项包括“左”、“中”和“右” 水平对齐 以及顶部、中心和底部 垂直对齐.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top