我有以下网格:
<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而不是代码中执行此操作。提前谢谢......
答案 0 :(得分:2)
我可以想到两种简单的方法
第一种方法是根据RowDefinitions
值调整网格Expander.IsExpanded
。我有一些GridHelpers on my blog允许您绑定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>
第二个选项是使用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>
我的博客上的这个转换器只有在你知道Row0的常规IValueConverter
之前的高度时才会起作用,但是如果你需要传递它就很容易转换为IMultiValueConverter
Row0的高度也是如此。我实际上已经有了代码,但我还没有更新我的博客帖子。
答案 1 :(得分: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);
}