设置一个WPF控件扩展以填充可用空间,并没有更多的
-
19-09-2019 - |
题
我
如何才能建立一个WPF控件填写其父容器中的可用空间,但不展开父?
下面的代码片断描述我试图布局。我想Grid
伸展以适应Expander
,和我想的ListBox
不仅填补了Grid
。我希望在ListBox
太小,无法显示所有Grid
s出现在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
变得太大,以适应在屏幕上。
解决方案
要解决我写特殊的容器类同样的问题:
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;
}
}
其他提示
什么是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>
不隶属于 StackOverflow