【问题标题】:WPF Grid sizingWPF 网格大小调整
【发布时间】:2012-06-24 01:42:13
【问题描述】:

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

目前我有一个两行网格。第一行的高度是Auto,第二行的高度是*,所以当我调整窗口大小时,第二行会随着窗口的大小而增长和缩小。

这是基本布局:

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

这是对现有行为的粗略描述:

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

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

期望的行为:

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

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

更多细节:

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

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

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

【问题讨论】:

    标签: c# .net wpf xaml user-interface


    【解决方案1】:

    第一行中控件的大小在编译时是未知的,但在运行时是已知的。如果它是解决方案的必要部分,我可以设置行的 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;
    }
    

    【讨论】:

    • 不起作用。第一行的高度与第二行没有 MinHeight 时的行为完全相同。它调整大小的速度只有窗口的一半。这会导致第二行被剪裁。
    • @KendallFrey 以前的解决方案不适用于所有情况,所以我添加了一个应该满足您需求的解决方案。
    • 感谢 MultiBinding。我不知道那件事。一个问题:实际的网格还有其他几个固定大小和自动大小的行,所以我假设我应该做gridHeight - row2height - row3height 等?
    • 是的,不幸的是我认为没有更简单的方法。基本上将 row2Height 替换为除第 1 行之外的所有行的总和。
    • 感谢您的帮助。我开始担心我必须编写一个自定义控件,但我认为这更好地回答了这个问题。
    猜你喜欢
    • 2011-01-07
    • 2018-06-05
    • 2017-02-26
    • 2013-05-11
    • 2012-07-03
    • 2012-12-22
    • 2017-08-04
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多