如何让WPF中的控件填充可用空间?

有些WPF控件(如Button )似乎很高兴地使用其容器中的所有可用空间,如果您没有指定它的高度。

还有一些,就像我现在需要使用的那些,(多行) TextBoxListBox似乎更担心只是为了适应其内容而需要的空间,而没有更多。

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

我会认为这实际上是一个基本的布局要求,但我不知道如何让他们填补他们可能的空间(把它们放在DockPanel并设置它填充也不起作用,看起来,因为DockPanel只占用其子控件所需的空间。

如果你必须玩HeightWidthMinHeightMinWidth等,可调整大小的GUI将会非常可怕。

你可以将你的HeightWidth属性绑定到你占据的网格单元吗? 还是有另一种方法来做到这一点?


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

  • Measure()确定面板及其每个子项的大小
  • Arrange()确定每个控件呈现的矩形
  • DockPanel的最后一个孩子填充剩余的空间。 您可以通过将LastChild属性设置为false来禁用此行为。

    StackPanel询问每个孩子所需的尺寸,然后堆叠它们。 堆栈面板在每个孩子上调用Measure() ,并使用可用的Infinity大小,然后使用孩子所需的大小。

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

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

    看到这篇文章为一个简单的例子。


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

    HorizontalContentAlignment="Stretch"
    

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

    HorizontalAlignment="Stretch"
    

    ...强制控件本身水平伸展以填充其父项。


    那么,我发现自己,发布后,这是最令人尴尬的方式。 :)

    看来StackPanel的每个成员都会填充它的最小请求大小。

    在DockPanel中,我以错误的顺序停靠了东西。 如果文本框或列表框是唯一没有对齐的停靠项目,或者它们是最后添加的项目,它们将根据需要填充剩余空间。

    我很想看到处理这个更优雅的方法,但它会。

    链接地址: http://www.djcxy.com/p/8821.html

    上一篇: How to get controls in WPF to fill available space?

    下一篇: Do you know any patterns for GUI programming? (Not patterns on designing GUIs)