6

この質問は簡潔に説明するのが難しいので、我慢してください。

現在、2行のグリッドがあります。1 行目の高さは Auto、2 行目の高さは * なので、ウィンドウのサイズを変更すると、2 行目はウィンドウに合わせて拡大縮小します。

これは基本的なレイアウトです:

<Window>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Border>
            ...
        </Border>
        <Border Grid.Row="2">
            ...
        </Border>
    </Grid>
</Window>

これは、既存の動作の貧弱なスケッチです。

____    ____    ____
     ->      ->
____    ____    ____
                ____
        ____
____

ウィンドウのサイズを十分に小さくすると、2 行目の縮小が停止し、代わりに 1 行目の縮小が開始されるように、2 行目に一種の「最小の高さ」を追加したいと思います。

望ましい動作:

____    ____    ____
     ->      -> ____
____    ____
                ____
        ____
____

2 番目の行の最小の高さを取得し、最初の行を強制的に縮小する簡単な方法はありますか?

詳細:

2 行目に MinHeight を設定すると、グリッドのサイズをそのサイズより下に変更すると、グリッドがクリップされます。

最初の行のコントロールのサイズはコンパイル時には不明ですが、実行時にはわかります。ソリューションの必要な部分である場合は、行の MaxHeight を設定できますが、現在は自動高さが機能しています。

2 行目のコントロールには明示的なサイズがありません。サイズ変更は許可されていますが、必要な最小高よりも小さくならないようにしています。

4

1 に答える 1

7

最初の行のコントロールのサイズはコンパイル時には不明ですが、実行時にはわかります。ソリューションの必要な部分である場合は、行の MaxHeight を設定できますが、現在は自動高さが機能しています。

これがおそらく最も簡単な解決策になると思います。実行時に MaxHeight を計算値にバインドします。

<Grid.RowDefinitions>
    <RowDefinition Height="*" MaxHeight="{Binding MyProperty}"/>
    <RowDefinition Height="*" MinHeight="100"/>
</Grid.RowDefinitions>

編集:前の解決策は近いですが、正しくありません。これがあなたの望ましい結果を達成する方法ですが、それが最適なアプローチであるかどうかはわかりません:

<Grid ShowGridLines="True" Name="myGrid">
    <Grid.Resources>
        <local:RowHeightConverter x:Key="rowHeightConverter" />
    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition Name="row1" MaxHeight="{Binding MyProperty}">
            <RowDefinition.Height>
                <MultiBinding Converter="{StaticResource rowHeightConverter}">
                    <Binding Path="ActualHeight" ElementName="row2" />
                    <Binding Path="ActualHeight" ElementName="myGrid" />
                    <Binding Path="MaxHeight" ElementName="row1" />
                </MultiBinding>
            </RowDefinition.Height>
        </RowDefinition>
        <RowDefinition Name="row2" Height="*" MinHeight="300"/>
    </Grid.RowDefinitions>
</Grid>

そしてあなたのコンバーター:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    double row2Height = (double)values[0];
    double gridHeight = (double)values[1];
    double row1MaxHeight = (double)values[2];

    if (gridHeight - row2Height >= row1MaxHeight)
    {
        return gridHeight - row2Height;
    }

    return row1MaxHeight;
}
于 2012-06-21T18:52:54.833 に答える