これを行う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 番目のオプションは、Converter
andを使用して、展開時に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
私は実際にそのためのコードを既に持っていますが、まだブログ投稿を更新していません。