如何设置WPF控件来填充其父容器中的可用空间,但不能展开父容器?
以下代码段描述了我正在尝试的布局。我希望Grid
能够展开以适应Expander
,我希望ListBox
仅填充Grid
。当ListBox
太小而无法显示所有Grid
时,我希望ListBoxItem
的滚动条显示。
<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
太大而无法放在屏幕上时显示外部滚动条。
答案 0 :(得分:3)
为了解决同样的问题,我写了一个特殊的容器类:
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的高度相同。
<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;
}
}
答案 1 :(得分:0)
ScrollViewer
有什么意义?当空间太小时,只需让ScrollViewer
模板中的ListBox
自然显示。
<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>