代码之家  ›  专栏  ›  技术社区  ›  sourcenouveau

将wpf控件设置为展开以填充可用空间,不再设置

  •  2
  • sourcenouveau  · 技术社区  · 15 年前

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

    下面的代码段描述了我正在尝试的布局。我想要 Grid 拉伸以适应 Expander ,我想要 ListBox 只为了填满 网格 . 我想要 列表框 的滚动条,当 网格 太小,无法显示所有 ListBoxItem S.

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

    目前发生的是 网格 拉伸以适应整个 列表框 和外部 ScrollViewer 出现的垂直滚动条。我只希望外部滚动条在 膨胀机 太大了,不能放在屏幕上。

    2 回复  |  直到 13 年前
        1
  •  3
  •   Ilya Serbis    14 年前

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

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

    用容器包围列表框,列表框的高度与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;
        }
    }
    
        2
  •  0
  •   Tim Cooper    13 年前

    有什么意义 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>