2

レイアウトがトップレベルの3行で構成されるWPFアプリケーションがあります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

これが重要な場合。

4

3 に答える 3

8

私がそれを正しく理解していれば、おそらく属性を使用してからのにAutoバインドすることができます。多分このようなもの:MaxHeightHeightGrid

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>
...

お役に立てれば。

于 2012-12-13T13:05:18.137 に答える
7

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>

于 2012-12-13T14:17:42.477 に答える
1

マットの提案をさらに単純で明確にすることができます。

<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>
于 2018-11-28T10:30:25.550 に答える