如何在WPF中获取控件以填充可用空间?

如何在WPF中获取控件以填充可用空间?,wpf,user-interface,layout,Wpf,User Interface,Layout,一些WPF控件(如按钮)似乎很乐意使用其“容器”中的所有可用空间,如果您不指定其高度的话 还有一些,比如我现在需要使用的(多行)TextBox和ListBox似乎更担心占用空间来容纳它们的内容,而不是更多 如果您将这些人放在UniformGrid中的单元格中,他们将扩展以适应可用空间。但是,UniformGrid实例并不适用于所有情况。如果网格中的某些行设置为*高度,以在其自身和其他*行之间划分高度,该怎么办?如果你有一个堆叠面板,你有一个标签,一个列表和一个按钮,你如何让列表占据标签和按钮未占

一些WPF控件(如
按钮
)似乎很乐意使用其“容器”中的所有可用空间,如果您不指定其高度的话

还有一些,比如我现在需要使用的(多行)
TextBox
ListBox
似乎更担心占用空间来容纳它们的内容,而不是更多

如果您将这些人放在
UniformGrid
中的单元格中,他们将扩展以适应可用空间。但是,
UniformGrid
实例并不适用于所有情况。如果网格中的某些行设置为*高度,以在其自身和其他*行之间划分高度,该怎么办?如果你有一个
堆叠面板
,你有一个
标签
,一个
列表
和一个
按钮
,你如何让列表占据标签和按钮未占用的所有空间

我认为这真的是一个基本的布局要求,但我不知道如何让它们填充它们可以填充的空间(将它们放在
DockPanel
中并将其设置为填充似乎也不起作用,因为
DockPanel
只占用其“子角色”所需的空间)

如果必须使用
Height
Width
MinHeight
MinWidth
等,那么可调整大小的GUI将非常糟糕


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

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

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

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


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

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

HorizontalContentAlignment="Stretch"
HorizontalAlignment="Stretch"
。。。强制控件的内容水平拉伸。或者你可以说:

HorizontalContentAlignment="Stretch"
HorizontalAlignment="Stretch"

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

面板派生的每个控件实现在
测量()
排列()
中执行的不同布局逻辑:

  • Measure()
    确定面板及其每个子面板的大小
  • Arrange()
    确定每个控件呈现的矩形
DockPanel
的最后一个子项将填充剩余空间。您可以通过将
LastChild
属性设置为
false
来禁用此行为

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

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

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


有关简单示例,请参见。

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

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


这两个属性的默认值都是拉伸,因此子元素将拉伸以填充所有可用空间。其他选项包括水平对齐的左、中、右选项,垂直对齐的上、中、下选项。如果这总是正确的,则不会询问原始问题。例如,一个带有标签和文本框的水平堆叠面板。文本框右侧有额外的空间。文本框设置为自动宽度。将Stretch设置为HorizontalAlignment不会使文本框填满剩余的空间。没有什么总是正确的,但这个答案适合我的需要:DockPanel、Image。在所有这些情况下,提到的最臭名昭著的面板是StackPanel。它不包含ContentAlignment属性,并且将其子项设置为“拉伸”在星形网格中没有任何效果。非常令人沮丧。几乎就好像StackPanel是WPF团队编写的第一个容器一样,这种情况下它会受到影响。@Brent-ah!我一直在努力让stackpanel的内容正确填充。谢谢我认为这只是我做错了什么。@townsean Stack面板非常有限,使用UniformGrid拉伸并将行或列设置为0@Tuskan360UniformGrid只允许单元格大小相同。我最后用了一个网格,似乎很管用。令人恼火的是StackPanel并没有做到它看起来设计的目的。@TarkaDaal yeh,UniformGrid如果所有东西都是相同的大小,Grid如果你想指定复杂的相对大小,stack panel只根据内容调整大小,而忽略有多少可用空间。UniformGrid是惊人的,我的新默认goto标记。我喜欢Stackpanels的简单性(让我想起了一个div),但UniformGrid正是我所需要的。重点是统一。似乎您无法调整列宽,没有行高。只是