329

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

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

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

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

如果您必须使用Height, Width,MinHeight等来调整大小的 GUI 将是非常可怕的MinWidth

您可以将您的HeightWidth属性绑定到您占用的网格单元吗?还是有其他方法可以做到这一点?

4

4 回答 4

261

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

HorizontalContentAlignment="Stretch"

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

HorizontalAlignment="Stretch"

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

于 2008-08-31T04:34:37.063 回答
172

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

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

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

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

AGrid占据所有可用空间,但是,它将每个孩子设置为所需的大小,然后将它们放在单元格中。

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

有关简单示例,请参阅本文

于 2008-08-31T10:04:15.150 回答
23

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

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

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

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

于 2008-08-30T17:28:01.893 回答
6

使用Horizo​​ntalAlignmentVerticalAlignment布局属性。当可用空间多于元素所需的空间时,它们控制元素如何使用其父元素内部的空间。

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

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

于 2008-08-31T10:24:05.820 回答