4

如何设置 WPF 控件以填充其父容器中的可用空间,但不扩展父容器?

以下片段描述了我正在尝试的布局。我想Grid拉伸以容纳Expander,而我想ListBox只填充Grid。当太小而无法显示所有s 时,我希望ListBox出现 的滚动条。GridListBoxItem

<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我只希望在屏幕太大而无法显示外部滚动条时出现。

4

2 回答 2

4

为了解决同样的问题,我编写了特殊的容器类:

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 将尽可能小。因此,您不能将父网格单元格的宽度或高度设置为 Auto。

如果需要自动调整大小,请重写容器:

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;
    }
}
于 2011-05-23T08:58:59.770 回答
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>
于 2009-08-21T13:50:21.230 回答