Button
如果你没有指定它的高度,一些WPF控件(比如)似乎很乐意消耗它'容器中的所有可用空间.
还有一些,比如我现在需要使用的那些,(多线)TextBox
而且ListBox
似乎更担心只需占用适合其内容所需的空间,而不是更多.
如果你将这些人放在一个单元格中UniformGrid
,它们将扩展以适应可用空间.但是,UniformGrid
实例并不适合所有情况.如果你有一个网格,其中一些行设置为*高度,以划分自身与其他*行之间的高度,该怎么办?如果你有一个StackPanel
,你有a Label
,a List
和a Button
,你怎么能得到列表占据标签和按钮没有吃掉的所有空间怎么办?
我认为这确实是一个基本的布局要求,但我无法弄清楚如何让它们填充他们可以填充的空间(将它们放入并将其DockPanel
设置为填充也不起作用,似乎,因为在DockPanel
只占用其子控件所需的空间).
一个可调整大小的GUI将是相当可怕的,如果你有一起玩Height
,Width
,MinHeight
,MinWidth
等.
你可以绑定你Height
和Width
属性,以你占据网格单元?或者还有另一种方法吗?
还有一些属性可以设置为强制控件填充其可用空间,否则不会这样做.例如,您可以说:
HorizontalContentAlignment="Stretch"
...强制控件的内容水平拉伸.或者你可以说:
HorizontalAlignment="Stretch"
...强制控件本身水平拉伸以填充其父级.
每个控件派生自Panel
实现在Measure()
和中执行的不同布局逻辑Arrange()
:
Measure()
确定面板及其每个子节点的大小
Arrange()
确定每个控件呈现的矩形
DockPanel
填补剩余空间的最后一个孩子.您可以通过将LastChild
属性设置为禁用此行为false
.
该StackPanel
要求每个孩子的所需的大小,然后堆叠它们.堆栈面板调用Measure()
每个孩子,可用大小为Infinity
,然后使用孩子所需的大小.
A Grid
占用所有可用空间,但是,它会将每个孩子设置为所需的大小,然后将它们放在单元格中.
您可以通过派生Panel
然后覆盖MeasureOverride()
和实现自己的布局逻辑ArrangeOverride()
.
有关简单示例,请参阅此文章.
嗯,我发布后就知道了,这是最令人尴尬的方式.:)
看起来StackPanel的每个成员都会填充其最小请求大小.
在DockPanel中,我以错误的顺序停靠了东西.如果TextBox或ListBox是唯一没有对齐的停靠项,或者它们是最后添加的,它们将按需填充剩余空间.
我希望看到一种更优雅的方法来处理这个问题,但它会做到.