我能想到的這樣的兩種簡單的方法
第一個將根據Expander.IsExpanded
值調整網格的RowDefinitions
。我有一些GridHelpers on my blog,它允許你綁定網格的行和列定義,而不必手動定義它們,這使得這更容易。使用這些傭工,最終的結果是這樣的:
<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>
第二個選擇是使用一個Converter
和Trigger
那臺時,它的擴大Expander.MinHeight
到(Grid.ActualHeight - Row0Content.ActualHeight)/2
。我也有一個MathConverter on my blog,這可能會使這更容易,或者你可以創建自己的。
<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>
我的博客上該轉換器,如果你因爲它經常IValueConverter
知道ROW0的高度提前只會工作,但它是很容易轉換成IMultiValueConverter
如果你需要將它傳遞0行的高度,以及。我其實已經有了這個代碼,但是我還沒有開始更新我的博客文章。
昨晚我剛剛有這個確切的問題,還沒有想出一個好的解決方案。 – CodingGorilla