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

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

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

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

一个可调整大小的GUI将是相当可怕的,如果你必须玩的高度,宽度,MinHeight, MinWidth等。

可以将高度和宽度属性绑定到所占用的网格单元格吗?或者还有别的办法吗?


当前回答

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

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

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

其他回答

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

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

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

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

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

HorizontalContentAlignment="Stretch"

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

HorizontalAlignment="Stretch"

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

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

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

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

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

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

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

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

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

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

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

在你的xaml中使用SizeChanged="OnSizeChanged",在后面的代码中设置你想要的大小。

private void OnSizeChanged(object sender, SizeChangedEventArgs e)
        {
            TheScrollViewer.Height = MainWin.Height - 100;
        }

从长远来看,这对你有好处。 当你的经理走过来,要求你“把它做大一点”时,你不会花一下午的时间去摆弄布局控制,试图让它工作。你也不必解释为什么你花了一下午的时间试图让它工作。