我可以想到两种简单的方法来做到这一点
第一个是RowDefinitions
根据Expander.IsExpanded
值调整网格。我的博客上有一些GridHelpers,它们允许您绑定 Grid 的行和列定义,而不必手动定义它们,这使这变得更加容易。使用这些助手,最终结果将如下所示:
<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>
第二个选项是使用 aConverter
并将Trigger
其设置为Expander.MinHeight
展开(Grid.ActualHeight - Row0Content.ActualHeight) / 2
时。我的博客上还有一个MathConverter,它可能会使这更容易,或者您可以创建自己的。
<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 的高度,IValueConverter
它很容易转换为。IMultiValueConverter
我实际上已经有了代码,但我还没有开始更新我的博客文章。