限行的在WPF都“自动”和“1 *”的高度(Limit row's height on bo

2019-08-04 02:05发布

我有一个WPF应用程序在顶层,其布局由3行Grid

我想中间行使用了它需要的空间(它需要的最大空间是有限的,但依赖于窗口的宽度)。 底行应使用剩余空间。 最棘手的部分是排在前列。 其尺寸可以根据一个按钮,切换内容的很大一部分的可见性而变化。 我想它利用身高的最多50%,但比它真正需要的不是更多。 下面的XAML介绍我想要完成的任务:

    <Grid.RowDefinitions>
        <!-- neither "1*" nor "Auto" fully meets my needs -->
        <RowDefinition Height="Min(1*,Auto)"></RowDefinition>

        <RowDefinition Height="Auto"></RowDefinition>

        <RowDefinition Height="1*"></RowDefinition>
    </Grid.RowDefinitions>

该行是:

  1. WrapPanel
  2. WrapPanel
  3. TextBox

如果这是非常重要的。

Answer 1:

如果我的理解对不对,你很可能使用Auto ,然后绑定MaxHeight属性的Height中的Grid 。 也许是这样的:

MaxHeightConverter.cs:

public class MaxHeightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            throw new ArgumentException("MaxHeightConverter expects a height value", "values");

        return ((double)value / 2);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

MyWindow.xaml:

...
xmlns:converters="clr-namespace:MyApp.Namespace"
...
<Window.Resources>
    <converters:MaxHeightConverter x:Key="MaxHeightValue" />
</Window.Resources>

<Grid x:Name="root">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="1*"></RowDefinition>
    </Grid.RowDefinitions>

    <WrapPanel >
        <WrapPanel.MaxHeight>
            <Binding Converter="{StaticResource MaxHeightValue}" ElementName="root" Path="ActualHeight" />
        </WrapPanel.MaxHeight>
    </WrapPanel>
</Grid>
...

希望这可以帮助。



Answer 2:

你可以只用XAML做另一种方式是结合一个隐藏的对象,它是你想要的高度:

<Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*" />
            <RowDefinition Height="1*" />
        </Grid.RowDefinitions>
        <Border Background="White" Visibility="Hidden" x:Name="HalfHeightRow" x:FieldModifier="private" />
    </Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Border Height="1000" Background="Red" MaxHeight="{Binding ActualHeight, ElementName=HalfHeightRow}" />
        <Border Grid.Row="1" Height="100" Background="Green" />
        <Border Grid.Row="2" Background="Blue" />
    </Grid>



Answer 3:

你可以让马特的建议,更简单,更清晰。

<Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*" x:Name="HalfHeightRow"/>
            <RowDefinition Height="1*" />
        </Grid.RowDefinitions>
    </Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" MaxHeight="{Binding ActualHeight, ElementName=HalfHeightRow}"/>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Border Height="1000" Background="Red" />
        <Border Grid.Row="1" Height="100" Background="Green" />
        <Border Grid.Row="2" Background="Blue" />
    </Grid>


文章来源: Limit row's height on both “Auto” and “1*” in WPF