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

Run*_*sen 292 wpf layout user-interface

Button如果你没有指定它的高度,一些WPF控件(比如)似乎很乐意消耗它'容器中的所有可用空间.

还有一些,比如我现在需要使用的那些,(多线)TextBox而且ListBox似乎更担心只需占用适合其内容所需的空间,而不是更多.

如果你将这些人放在一个单元格中UniformGrid,它们将扩展以适应可用空间.但是,UniformGrid实例并不适合所有情况.如果你有一个网格,其中一些行设置为*高度,以划分自身与其他*行之间的高度,该怎么办?如果你有一个StackPanel,你有a Label,a List和a Button,你怎么能得到列表占据标签和按钮没有吃掉的所有空间怎么办?

我认为这确实是一个基本的布局要求,但我无法弄清楚如何让它们填充他们可以填充的空间(将它们放入并将其DockPanel设置为填充也不起作用,似乎,因为在DockPanel只占用其子控件所需的空间).

一个可调整大小的GUI将是相当可怕的,如果你有一起玩Height,Width,MinHeight,MinWidth等.

你可以绑定你HeightWidth属性,以你占据网格单元?或者还有另一种方法吗?

Mat*_*ton 222

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

HorizontalContentAlignment="Stretch"
Run Code Online (Sandbox Code Playgroud)

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

HorizontalAlignment="Stretch"
Run Code Online (Sandbox Code Playgroud)

...强制控件本身水平拉伸以填充其父级.

  • 在所有这些案例中提到的最臭名昭着的小组是StackPanel.它不包含ContentAlignment属性,将其子项设置为Stretch将不会影响星型网格.很沮丧.这几乎就像StackPanel是WPF团队编写的第一个容器一样,它就是这样的. (84认同)
  • @townsean Stack面板非常有限,使用UniformGrid进行拉伸并将Rows或Columns设置为0可以获得类似的行为 (7认同)
  • @Brent - 啊!我一直坚持试图让我的stackpanel内容正确填充.谢谢!我认为这只是我做错了. (4认同)
  • @TarkaDaal yeh,UniformGrid如果一切都是相同的大小,网格如果你想指定复杂的相对大小,叠加面板只是基于内容的大小,并忽略可用的空间. (3认同)
  • @ Tuskan360 UniformGrid 只允许单元格大小相同。我最终使用了网格,似乎有效。令人讨厌的是 StackPanel 没有按照它看似设计的方式来做。 (2认同)

use*_*837 159

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

  • Measure() 确定面板及其每个子节点的大小
  • Arrange() 确定每个控件呈现的矩形

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

StackPanel要求每个孩子的所需的大小,然后堆叠它们.堆栈面板调用Measure()每个孩子,可用大小为Infinity,然后使用孩子所需的大小.

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

您可以通过派生Panel然后覆盖MeasureOverride()和实现自己的布局逻辑ArrangeOverride().

有关简单示例,请参阅此文章.

  • 链接现在已经死了 (7认同)
  • @ user3690202 Archive.org是你的朋友.链接复活. (5认同)
  • 该主题仍然存在于MSDN中,但链接已更改为:https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/how-to-create-a-custom-panel-element (3认同)
  • “DockPanel 的最后一个子元素填充了剩余空间”:这是我理解中缺失的关键。我一直认为没有显式 Dock 的元素填充了空间。 (3认同)

Run*_*sen 18

嗯,我发布后就知道了,这是最令人尴尬的方式.:)

看起来StackPanel的每个成员都会填充其最小请求大小.

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

我希望看到一种更优雅的方法来处理这个问题,但它会做到.


uri*_*ini 5

使用Horizo​​ntalAlignmentVerticalAlignment布局属性。当可用空间超过元素所需的空间时,它们控制元素如何使用其父元素内部的空间。

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

这两个属性的默认值都是 Stretch,因此子元素被拉伸以填充所有可用空间。其他选项包括左,中,右为的Horizo​​ntalAlignment和顶部,中部和底部VerticalAlignment

  • 如果这总是正确的,就不会提出最初的问题。以带有标签和文本框的水平 StackPanel 为例。TextBox 右侧有额外的空间。文本框设置为自动宽度。为 Horizo​​ntalAlignment 设置 Stretch 不会使 TextBox 填充剩余空间。 (34认同)