1

次のグリッドがあります。

            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
...

                <Expander Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">
                    <TextBox />
                </Expander>

テキスト ボックスがエキスパンダーを埋めます。一番下の行が展開されているとき、行の高さは Auto / * / * で、下が折りたたまれているとき、行の高さは Auto / * / Auto になるように設定したいと思います。これを行うためにスタイル トリガーを使用して (成功せずに) 試みましたが、可能な限りコードではなく XAML でこれを行いたいと考えています。前もって感謝します...

4

2 に答える 2

2

これを行う2つの簡単な方法を考えることができます

1 つ目は、値RowDefinitionsに基づいてグリッドを調整することです。私のブログには、手動で定義する代わりにグリッドの行と列の定義をバインドできるGridHelperExpander.IsExpandedがいくつかあります。これにより、これがはるかに簡単になります。これらのヘルパーを使用すると、最終結果は次のようになります。

<Grid local:GridHelpers.RowCount="3">
    <Grid.Style>
        <Style TargetType="{x:Type Grid}">
            <Setter Property="local:GridHelpers.StarRows" Value="1" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=MyExpander, Path=IsExpanded}" Value="True">
                    <Setter Property="local:GridHelpers.StarRows" Value="1,2" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Grid.Style>

    ...

    <Expander x:Name="MyExpander" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">
        <TextBox />
    </Expander>

</Grid>

2 番目のオプションは、Converterandを使用して、展開時にtoTriggerを設定することです。また、ブログに MathConverter があります。これを使用すると、これを簡単に行うことができます。独自のものを作成することもできます。Expander.MinHeight(Grid.ActualHeight - Row0Content.ActualHeight) / 2

<Grid x:Name="MyGrid">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <TextBox Height="50" Grid.Row="0" />
    <TextBox Grid.Row="1" />

    <Expander Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">
        <Expander.Style>
            <Style TargetType="{x:Type Expander }">
                <Setter Property="MinHeight" Value="0" />
                <Style.Triggers>
                    <Trigger Property="IsExpanded" Value="True">
                        <Setter Property="MinHeight" Value="{Binding 
                            ElementName=MyGrid, 
                            Path=ActualHeight,
                            Converter={StaticResource MathConverter},
                            ConverterParameter=((@VALUE-50)/2)" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Expander.Style>

        <TextBox />
    </Expander>
</Grid>

私のブログのこのコンバーターは、通常の Row0 であるため、事前に Row0 の高さがわかっている場合にのみ機能しますが、Row0 の高さも渡す必要がある場合はIValueConverter、非常に簡単に に変換できます。IMultiValueConverter私は実際にそのためのコードを既に持っていますが、まだブログ投稿を更新していません。

于 2012-08-24T16:31:50.493 に答える
1

これまでのところ、これは私の醜い回避策です:

<Window.Resources>
    <Style TargetType="Expander">
        <EventSetter Event="Expanded" Handler="ExpanderGrow"/>
        <EventSetter Event="Collapsed" Handler="ExpanderGrow"/>
    </Style>
</Window.Resources>

...そして必要な CS:

    public void ExpanderGrow(object sender, RoutedEventArgs e)
    {
        Expander expander = (Expander)sender;
        Grid grid = (Grid)expander.Parent;
        int index = Grid.GetRow(expander);
        RowDefinition rowdef = grid.RowDefinitions[index];

        rowdef.Height = new GridLength(1,
            expander.IsExpanded ? GridUnitType.Star : GridUnitType.Auto);
    }
于 2012-08-24T16:27:07.503 に答える