English 中文(简体)
如何在WPF中获取控件以填充可用空间?
原标题:
  • 时间:2008-08-30 16:39:28
  •  标签:

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

还有一些,比如我现在需要使用的,(多行)TextBoxListBox

如果你把这些家伙放在UniformGrid中的一个单元格中,他们会扩展以适应可用空间。然而,UniformGrid实例并不适用于所有情况。如果您有一个网格,其中一些行设置为*高度,以将其自身和其他*行的高度分开,该怎么办?如果您有一个StackPanel,并且有一个标签、一个列表和一个按钮怎么办?如何让列表占据标签和按钮未占用的所有空间?

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

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

您可以将高度宽度neneneba属性绑定到您占用的网格单元吗?或者有其他方法可以做到这一点吗?

最佳回答

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

  • Measure() determines the size of the panel and each of its children
  • Arrange() determines the rectangle where each control renders

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

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

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

您可以通过从Panel派生,然后重写MeasureOverride()ArrangeOverride。

请参阅本文是一个简单的例子。

问题回答

还可以设置一些财产,以强制控件填充其可用空间,否则控件将无法这样做。例如,您可以说:

HorizontalContentAlignment="Stretch"

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

HorizontalAlignment="Stretch"

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

好吧,我自己发现了,就在发布后,这是最令人尴尬的方式。:)

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

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

我很想看到一种更优雅的处理方法,但它会的。

使用HorizontalAlignment和VerticalAlignment布局财产。当可用空间大于图元所需空间时,它们控制图元如何使用其父图元内部的空间。

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

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

在xaml中使用SizeChange=“OnSizeChanged”,并在后面的代码中设置所需的大小。

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

Long term it will be better for you. When your manager comes along and asks "make that a bit bigger" you won t to spend the afternoon messing about with layout controls trying to get it to work. Also you won t have to explain WHY you spent the afternoon trying to make it work.





相关问题