链接扩展器操作到RowDefinition高度

时间:2012-08-24 15:12:14

标签: wpf expander grid-layout

我有以下网格:

            <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而不是代码中执行此操作。提前谢谢......

2 个答案:

答案 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>

第二个选项是使用ConverterTriggerExpander.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);
    }