如何设置 WPF 控件来填充其父级容器中的可用空间,但不展开父级?
以下代码片段描述了我正在尝试的布局。我想要Grid
伸展以适应Expander
,我想要ListBox
只为了填补Grid
。我想要ListBox
的滚动条出现时Grid
太小,无法显示全部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
变得太大而无法显示在屏幕上。
为了解决同样的问题,我编写了特殊的容器类:
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;
}
}
用容器包围您的列表框,列表框的高度将与扩展器的高度相同。
<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 将尽可能小。所以你不能将父网格单元格的宽度或高度设置为自动。
如果需要自动调整大小,请重写容器:
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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)