如何在WPF中获取控件来填充可用空间?
有些WPF控件(如Button
)似乎很高兴地使用它的容器中的所有可用空间,如果你没有指定它的高度。
还有一些,就像我现在需要使用的那些,(多行) TextBox
和ListBox
似乎更担心只是为了适应其内容而需要的空间,而没有更多。
如果你把这些家伙放在UniformGrid
一个单元格中,它们将会展开以适应可用的空间。 但是, UniformGrid
实例并不适合所有情况。 如果你有一个网格,一些行设置为*高度来划分本身和其他*行之间的高度? 如果你有一个StackPanel
并且你有一个Label
,一个List
和一个Button
,那你怎么能得到这个列表来占用所有没有被标签和button所占用的空间呢?
我会认为这将是一个基本的布局要求,但我不知道如何让他们填补他们可能的空间(把他们放在一个DockPanel
并设置它填充也行不通,看来,因为DockPanel
只占用其子控制所需的空间。
如果你必须玩Height
, Width
, MinHeight
, MinWidth
等等,一个可resize的GUI将是非常可怕的。
你可以绑定你的Height
和Width
属性到你占据的网格单元? 还是有另一种方法来做到这一点?
从Panel
派生的每个控件都实现了在Measure()
和Arrange()
执行的不同的布局逻辑:
-
Measure()
确定面板及其每个子级的大小 -
Arrange()
确定每个控件呈现的矩形
DockPanel
的最后一个孩子填充剩余的空间。 您可以通过将LastChild
属性设置为false
来禁用此行为。
StackPanel
询问每个孩子所需的大小,然后堆叠它们。 堆栈面板在每个子项上调用Measure()
,并使用Infinity
的可用大小,然后使用子项的所需大小。
Grid
占用所有可用空间,但是,它会将每个孩子设置为所需的大小,然后将其置于单元中。
您可以通过从Panel
派生,然后重写MeasureOverride()
和ArrangeOverride()
来实现自己的布局逻辑。
看一个简单的例子这篇文章 。
还有一些属性可以设置为强制控件填充其可用空间,否则就不会这样做。 例如,你可以说:
HorizontalContentAlignment="Stretch"
…强制控件的内容水平拉伸。 或者你可以说:
HorizontalAlignment="Stretch"
…强制控制本身水平伸展以填充其父项。
那么,我发现自己,发布后,这是最尴尬的方式。 🙂
看来StackPanel的每个成员都会简单地填充它的最小请求大小。
在DockPanel中,我按照错误的顺序停靠了东西。 如果文本框或列表框是唯一没有alignment的停靠项目,或者它们是最后添加的项目,它们将根据需要填充剩余的空间。
我很想看到处理这个更优雅的方法,但它会做的。
使用HorizontalAlignment和VerticalAlignment布局属性。 它们控制元素如何使用元素所需的空间时,元素使用其父元素中的空间的方式。
例如,一个StackPanel的宽度将和它所包含的最宽的元素一样宽。 所以,所有较窄的元素都有一些额外的空间。 alignment属性控制子元素对多余空间的操作。
这两个属性的默认值是Stretch,所以子元素被拉伸以填充所有可用空间。 其他选项包括水平alignment的左,中和右, 垂直alignment的顶端,中间和底端。