设置WPF控件以展开以填充可用空间,仅此而已 [英] Setting a WPF control to expand to fill available space, and no more
问题描述
如何设置WPF控件以填充其父级容器中的可用空间,而不扩展父级容器?
How can I set up a WPF control to fill the available space in its parent's container, but not expand the parent?
以下代码段描述了我正在尝试的布局.我希望Grid
能够扩展以容纳Expander
,并且我希望ListBox
仅填充Grid
.我希望当Grid
太小而无法显示所有ListBoxItem
时,出现ListBox
的滚动条.
The following snippet describes the layout I am attempting. I would like the Grid
to stretch to accommodate the Expander
, and I would like the ListBox
only to fill the Grid
. I want the ListBox
's scroll bar to appear when the Grid
is too small to show all the ListBoxItem
s.
<ScrollViewer>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<ListBox Grid.Row="0" Grid.Column="0" />
<Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
</Grid>
</ScrollViewer>
当前发生的情况是Grid
拉伸以适合整个ListBox
,并且出现外部ScrollViewer
的垂直滚动条.我只希望在Expander
太大而无法在屏幕上显示时显示外部滚动条.
Currently what happens is that the Grid
stretches to fit the entire ListBox
, and the outer ScrollViewer
's vertical scroll bar appears. I only want the outer scroll bar to appear when the Expander
gets too big to fit on screen.
推荐答案
为解决相同的问题,我编写了特殊的容器类:
To solve the same problem I wrote special container class:
class FrugalContainer : Decorator
{
protected override Size MeasureOverride(Size availableSize)
{
return new Size(0, 0);
}
protected override Size ArrangeOverride(Size arrangeSize)
{
// get it all
Child.Measure(arrangeSize);
Child.Arrange(new Rect(arrangeSize));
return Child.RenderSize;
}
}
用容器围绕ListBox,ListBox的高度与Expander的高度相同.
Surround your ListBox by the container and the height of ListBox will be the same as of Expander.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<FrugalContainer Grid.Row="0" Grid.Column="0" >
<ListBox />
</FrugalContainer>
<Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
</Grid>
请注意,我从列的定义中删除了Width="Auto"
,因为FrugalContainer会尽可能小.因此,您不能将父网格的单元格的宽度或高度设置为自动".
Note that I remove Width="Auto"
from column's definition because the FrugalContainer will be as small as it can. So you can't set the width or height of the parent grid's cell to Auto.
如果需要自动调整大小,请重写容器:
If you need autosizing, rewrite the container:
class FrugalHeightContainer : Decorator
{
protected override Size MeasureOverride(Size availableSize)
{
Child.Measure(availableSize);
return new Size(Child.DesiredSize.Width, 0);
}
protected override Size ArrangeOverride(Size arrangeSize)
{
Child.Measure(arrangeSize);
Child.Arrange(new Rect(arrangeSize));
return Child.RenderSize;
}
}
这篇关于设置WPF控件以展开以填充可用空间,仅此而已的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!