设置一个WPF控件扩展以填充可用空间,并没有更多的(Setting a WPF control to

2019-08-02 02:08发布

我怎样才能建立一个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变得太大,以适应在屏幕上。

Answer 1:

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

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的高度环绕你的列表框将是相同的扩展的。

<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;
    }
}


Answer 2:

什么是点ScrollViewer ? 只是让ScrollViewerListBox模板自然会出现的时候太少空间可用。

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


文章来源: Setting a WPF control to expand to fill available space, and no more