题
一些 WPF 控件(例如 Button
)如果您不指定它的高度,似乎很乐意消耗其容器中的所有可用空间。
还有一些,比如我现在需要使用的(多行) TextBox
和 ListBox
似乎更担心只占用适合内容的必要空间,仅此而已。
如果你把这些人关在牢房里 UniformGrid
, ,它们将扩展以适应可用空间。然而, UniformGrid
实例并不适合所有情况。如果您有一个网格,其中某些行设置为 * 高度以将其高度除以自身和其他 * 行之间的高度,该怎么办?如果你有一个怎么办 StackPanel
你有一个 Label
, , A List
和一个 Button
, ,如何才能让列表占据所有未被标签和按钮占用的空间呢?
我认为这确实是一个基本的布局要求,但我不知道如何让它们填充它们可以填充的空间(将它们放在一个 DockPanel
并且将其设置为 fill 似乎也不起作用,因为 DockPanel
仅占用其子控件所需的空间)。
如果你不得不玩的话,一个可调整大小的 GUI 将是非常可怕的 Height
, Width
, MinHeight
, MinWidth
ETC。
可以绑定你的吗 Height
和 Width
您占据的网格单元的属性?或者还有其他方法可以做到这一点吗?
解决方案
每个控件都源自 Panel
实现不同的布局逻辑 Measure()
和 Arrange()
:
Measure()
确定面板及其每个子面板的大小Arrange()
确定每个控件呈现的矩形
的最后一个孩子 DockPanel
填充剩余空间。您可以通过设置来禁用此行为 LastChild
财产给 false
.
这 StackPanel
询问每个孩子想要的尺寸,然后将它们堆叠起来。堆栈面板调用 Measure()
每个孩子的可用大小为 Infinity
然后使用孩子想要的尺寸。
A Grid
占用所有可用空间,但是,它会将每个子项设置为其所需的大小,然后将它们置于单元格的中心。
您可以通过派生来实现自己的布局逻辑 Panel
然后覆盖 MeasureOverride()
和 ArrangeOverride()
.
看 本文 举一个简单的例子。
其他提示
您还可以设置一些属性来强制控件填充其可用空间,否则控件不会这样做。例如,你可以说:
HorizontalContentAlignment="Stretch"
...强制控件的内容水平拉伸。或者你可以说:
HorizontalAlignment="Stretch"
...强制控件本身水平拉伸以填充其父控件。
好吧,我自己想出来了,发完帖后,这是最尴尬的方式。:)
看起来 StackPanel 的每个成员都会简单地填充其最小请求大小。
在 DockPanel 中,我以错误的顺序停靠了一些东西。如果文本框或列表框是唯一没有对齐的停靠项目,或者它们是最后添加的,则它们将根据需要填充剩余空间。
我很想看到一种更优雅的方法来处理这个问题,但它就可以了。
使用 水平对齐 和 垂直对齐 布局属性。当可用空间多于元素所需的空间时,它们控制元素如何使用其父级内部的空间。
例如,StackPanel 的宽度将与其包含的最宽元素一样宽。因此,所有较窄的元素都有一些多余的空间。对齐属性控制子元素如何处理额外的空间。
这两个属性的默认值都是 Stretch,因此子元素会拉伸以填充所有可用空间。其他选项包括“左”、“中”和“右” 水平对齐 以及顶部、中心和底部 垂直对齐.