6

这个问题很难简洁地描述,所以请耐心等待。

目前我有一个两行的网格。第一行的高度是Auto,第二行的高度是*,所以当我调整窗口大小时,第二行会根据窗口的大小进行放大和缩小。

这是基本布局:

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

这是现有行为的简略草图:

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

我想在第二行添加一种“最小高度”,这样当我将窗口调整到足够小时,第二行停止收缩,而第一行开始收缩。

期望的行为:

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

有没有一种简单的方法来获得第二行的最小高度,并强制第一行缩小?

更多细节:

当我在第二行设置 MinHeight 时,当我将其调整到低于该大小时,它只会剪切网格。

第一行中控件的大小在编译时是未知的,但在运行时是已知的。如果它是解决方案的必要部分,我可以设置行的 MaxHeight,但现在自动高度正在工作。

第二行中的控件没有明确的大小。允许调整它们的大小,但我试图防止它们变得小于所需的最小高度。

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