如何让WPF中的控件填充可用空间?
有些WPF控件(如Button
)似乎很高兴地使用其容器中的所有可用空间,如果您没有指定它的高度。
还有一些,就像我现在需要使用的那些,(多行) TextBox
和ListBox
似乎更担心只是为了适应其内容而需要的空间,而没有更多。
如果你把这些家伙放在UniformGrid
一个单元中,它们将会扩展以适应可用空间。 但是, UniformGrid
实例并不适合所有情况。 如果你有一个网格,某些行设置为*高度来划分其自身与其他*行之间的高度? 如果你有一个StackPanel
并且你有一个Label
,一个List
和一个Button
,你怎么能得到这个列表来占用所有没有被标签和按钮占用的空间?
我会认为这实际上是一个基本的布局要求,但我不知道如何让他们填补他们可能的空间(把它们放在DockPanel
并设置它填充也不起作用,看起来,因为DockPanel
只占用其子控件所需的空间。
如果你必须玩Height
, Width
, MinHeight
, MinWidth
等,可调整大小的GUI将会非常可怕。
你可以将你的Height
和Width
属性绑定到你占据的网格单元吗? 还是有另一种方法来做到这一点?
从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)