4

親のコンテナー内の使用可能なスペースを埋めるように WPF コントロールを設定するにはどうすればよいですか?

次のスニペットは、私が試みているレイアウトについて説明しています。を にGrid合わせて伸縮させ、だけをに合わせExpanderたいと思います。が小さすぎてすべての を表示できない場合に、のスクロール バーが表示されるようにします。ListBoxGridListBoxGridListBoxItem

<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 に答える