首页 文章

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

提问于
浏览
271

一些WPF控件(如 Button )似乎很乐意消耗其' container if you don'中指定其高度的所有可用空间 .

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

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

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

如果你不得不玩 HeightWidthMinHeightMinWidth 等,可调整大小的GUI会非常糟糕 .

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

4 回答

  • 143

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

    • Measure() 确定面板及其每个子节点的大小

    • Arrange() 确定每个控件呈现的矩形

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

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

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

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

    有关简单示例,请参阅this article .

  • 15

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

    HorizontalContentAlignment="Stretch"
    

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

    HorizontalAlignment="Stretch"
    

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

  • 0

    好吧,我在发布之后就把它弄清楚了,这是最令人尴尬的方式 . :)

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

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

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

  • 202

    使用 HorizontalAlignmentVerticalAlignment 布局属性 . 它们控制元素在可用空间多于元素所需的空间时如何使用其父元素内的空间 .

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

    两个属性的默认值是Stretch,因此子元素被拉伸以填充所有可用空间 . 其他选项包括 HorizontalAlignment 的左,中和右以及 VerticalAlignment 的上,中和下 .

相关问题