如果您不指定它的高度,某些 WPF 控件(如 Button
)似乎很乐意消耗其容器中的所有可用空间。
还有一些,比如我现在需要使用的那些,(多行)TextBox
和 ListBox
似乎更担心只占用适合其内容所需的空间,仅此而已。
如果您将这些家伙放在 UniformGrid
中的一个单元格中,它们将展开以适应可用空间。但是,UniformGrid
实例并非适用于所有情况。如果您有一个网格,其中一些行设置为 * 高度以在其自身和其他 * 行之间划分高度怎么办?如果你有一个 StackPanel
并且你有一个 Label
、一个 List
和一个 Button
,你如何让列表占据标签和按钮没有占用的所有空间?
我认为这确实是一个基本的布局要求,但我不知道如何让它们填充它们可以填充的空间(将它们放在 DockPanel
中并将其设置为填充也不起作用,它似乎,因为 DockPanel
只占用其子控件所需的空间)。
如果您必须使用 Height
、Width
、MinHeight
、MinWidth
等,可调整大小的 GUI 将非常糟糕。
您可以将您的 Height
和 Width
属性绑定到您占用的网格单元吗?还是有其他方法可以做到这一点?
您还可以设置一些属性来强制控件填充其可用空间,否则它不会这样做。例如,您可以说:
HorizontalContentAlignment="Stretch"
...强制控件的内容水平拉伸。或者你可以说:
HorizontalAlignment="Stretch"
...强制控件本身水平拉伸以填充其父级。
从 Panel
派生的每个控件都实现了在 Measure()
和 Arrange()
中执行的不同布局逻辑:
Measure() 确定面板及其每个子项的大小
Arrange() 确定每个控件呈现的矩形
DockPanel
的最后一个子元素填充剩余空间。您可以通过将 LastChild
属性设置为 false
来禁用此行为。
StackPanel
询问每个孩子所需的大小,然后将它们堆叠起来。堆栈面板对每个子级调用 Measure()
,可用大小为 Infinity
,然后使用子级所需的大小。
Grid
占据所有可用空间,但是,它会将每个子项设置为所需的大小,然后将它们置于单元格的中心。
您可以通过从 Panel
派生然后覆盖 MeasureOverride()
和 ArrangeOverride()
来实现自己的布局逻辑。
有关简单示例,请参见 this article。
The last child of the DockPanel fills the remaining space
:这是我理解的缺失的关键。我总是认为没有显式 Dock 的元素填充了空间。
好吧,我自己在发帖后就自己想出来了,这是最尴尬的方式。 :)
似乎 StackPanel 的每个成员都会简单地填充其最小请求大小。
在 DockPanel 中,我以错误的顺序停靠了一些东西。如果 TextBox 或 ListBox 是唯一没有对齐的停靠项,或者如果它们是最后添加的,它们将根据需要填充剩余空间。
我很想看到一种更优雅的方法来处理这个问题,但它会做到的。
使用 HorizontalAlignment 和 VerticalAlignment 布局属性。当可用空间多于元素所需的空间时,它们控制元素如何使用其父元素内部的空间。
例如,StackPanel 的宽度将与其包含的最宽元素一样宽。因此,所有较窄的元素都有一些多余的空间。对齐属性控制子元素对额外空间的作用。
这两个属性的默认值都是 Stretch,因此子元素会被拉伸以填充所有可用空间。其他选项包括用于 HorizontalAlignment 的 Left、Center 和 Right 以及用于 VerticalAlignment 的 Top、Center 和 Bottom。
不定期副业成功案例分享