Wpf 移动GridSplitter后使用扩展器调整网格大小不工作

Wpf 移动GridSplitter后使用扩展器调整网格大小不工作,wpf,xaml,expander,gridsplitter,Wpf,Xaml,Expander,Gridsplitter,背景 我试图创建一个控件,它的顶部有一个文件资源管理器,底部有一个GridSplitter分隔的TreeView。用户可以更改文件资源管理器的大小,但不能超过最小值。当扩展器折叠时,树状视图将占据整个房间。当扩展器展开时,它会恢复到折叠前的大小 示例 我试着用post做一个有效的例子 当我折叠并展开GridSplitter时,首先调整大小是有效的 问题1 移动GridSplitter后,折叠后的大小调整不再起作用。 问题2 我可以在扩展器行的行定义中设置150的最小高度之外调整大小。

背景

我试图创建一个控件,它的顶部有一个文件资源管理器,底部有一个
GridSplitter
分隔的
TreeView
。用户可以更改文件资源管理器的大小,但不能超过最小值。当
扩展器
折叠时,
树状视图
将占据整个房间。当
扩展器
展开时,它会恢复到折叠前的大小

示例

我试着用post做一个有效的例子


当我折叠并展开
GridSplitter
时,首先调整大小是有效的

问题1

移动
GridSplitter
后,折叠后的大小调整不再起作用。

问题2

我可以在
扩展器
行的
行定义
中设置150的
最小高度
之外调整大小。


如何解决这些问题?

您当前的XAML无法工作有几个原因

  • 最小高度是在嵌套在GridSplitter看不到的面板内的元素上设置的。所以它永远不会尊重这个尺寸
  • GridSplitter会覆盖其相邻行定义的“高度”属性,因此,在展开和收拢扩展器时,不能使用样式触发器操纵高度,以便动态调整大小
  • 当展开器折叠并再次展开时,没有简单的方法可以恢复RowDefinition的先前高度
  • 这里是一个工作示例,我重新构造了XAML,以便GridSplitter可以遵循扩展器的最小高度

    我还引入了一个简单的附加行为类,它将对扩展器的展开和折叠事件作出反应,并将适当的目标RowDefinition的高度设置为Auto,以便获得所需的自动调整大小

    附加的行为类还将保留目标行定义的先前高度,并在展开扩展程序时恢复该高度

    XAML


    那真是太美了!非常感谢你!我将深入了解它的工作原理:)
    <Grid Margin="3">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition x:Name="ExpanderRow">
                <RowDefinition.Style>
                    <Style TargetType="{x:Type RowDefinition}">
                        <Setter Property="MinHeight" Value="150" />
                        <Style.Triggers>
                            <DataTrigger
                                Binding="{Binding ElementName=MyExpander, Path=IsExpanded}"
                                Value="False">
                                <Setter Property="MinHeight" Value="40" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </RowDefinition.Style>
            </RowDefinition>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
    
        <Border
            Grid.Row="0"
            Grid.RowSpan="2"
            BorderBrush="Red"
            BorderThickness="3" />
    
        <Button
            Grid.Row="0"
            Margin="6"
            HorizontalAlignment="Stretch"
            Content="Button 1" />
    
        <Expander x:Name="MyExpander"
            Grid.Row="1"
            Margin="6"
            local:ExpanderRowHeightBehavior.IsEnabled="True"
            local:ExpanderRowHeightBehavior.TargetRow="{Binding ElementName=ExpanderRow}"
            IsExpanded="True">
            <Border
                BorderBrush="Blue"
                BorderThickness="3" />
        </Expander>
    
        <GridSplitter
            Grid.Row="2"
            Height="3"
            Margin="3,0,3,0"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Center" />
    
        <Border
            Grid.Row="3"
            BorderBrush="Green"
            BorderThickness="3" />
    </Grid>
    
    using System.Windows;
    using System.Windows.Controls;
    
    namespace SO
    {
        public static class ExpanderRowHeightBehavior
        {
            #region IsEnabled (Attached Property)
            public static readonly DependencyProperty IsEnabledProperty =
                DependencyProperty.RegisterAttached(
                    "IsEnabled",
                    typeof(bool),
                    typeof(ExpanderRowHeightBehavior),
                    new PropertyMetadata(false, OnIsEnabledChanged));
    
            public static bool GetIsEnabled(DependencyObject obj)
            {
                return (bool)obj.GetValue(IsEnabledProperty);
            }
    
            public static void SetIsEnabled(DependencyObject obj, bool value)
            {
                obj.SetValue(IsEnabledProperty, value);
            }
    
            private static void OnIsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if (!(d is Expander expander)) return;
    
                expander.Collapsed += OnCollapsed;
                expander.Expanded += OnExpanded;
    
            }
            #endregion
    
            #region TargetRow (Attached Property)
            public static readonly DependencyProperty TargetRowProperty =
                DependencyProperty.RegisterAttached(
                    "TargetRow",
                    typeof(RowDefinition),
                    typeof(ExpanderRowHeightBehavior),
                    new PropertyMetadata(null));
    
            public static RowDefinition GetTargetRow(DependencyObject obj)
            {
                return (RowDefinition)obj.GetValue(TargetRowProperty);
            }
    
            public static void SetTargetRow(DependencyObject obj, RowDefinition value)
            {
                obj.SetValue(TargetRowProperty, value);
            }
            #endregion
    
            #region TargetRowPrevHeight (Attached Property)
            public static readonly DependencyProperty TargetRowPrevHeightProperty =
                DependencyProperty.RegisterAttached(
                    "TargetRowPrevHeight",
                    typeof(GridLength),
                    typeof(ExpanderRowHeightBehavior),
                    new PropertyMetadata(GridLength.Auto));
    
            public static GridLength GetTargetRowPrevHeight(DependencyObject obj)
            {
                return (GridLength)obj.GetValue(TargetRowPrevHeightProperty);
            }
    
            public static void SetTargetRowPrevHeight(DependencyObject obj, GridLength value)
            {
                obj.SetValue(TargetRowPrevHeightProperty, value);
            }
            #endregion
    
            private static void OnCollapsed(object sender, RoutedEventArgs e)
            {
                if (!(sender is Expander expander)) return;
    
                var targetRow = GetTargetRow(expander);
    
                if (targetRow == null) return;
    
                SetTargetRowPrevHeight(expander, targetRow.Height);
    
                targetRow.Height = GridLength.Auto;
            }
    
            private static void OnExpanded(object sender, RoutedEventArgs e)
            {
                if (!(sender is Expander expander)) return;
    
                var targetRow = GetTargetRow(expander);
    
                if (targetRow == null) return;
    
                var targetRowPrevHeight = GetTargetRowPrevHeight(expander);
    
                targetRow.Height = targetRowPrevHeight;
            }
        }
    }