将WPF控件设置为展开以填充可用空间,而不是更多

时间:2009-08-21 13:46:17

标签: wpf scroll height autosize stretching

如何设置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太大而无法放在屏幕上时显示外部滚动条。

2 个答案:

答案 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>