C# WPF Expander-当GridSplitter用于手动调整行大小时,行不会正确折叠

C# WPF Expander-当GridSplitter用于手动调整行大小时,行不会正确折叠,c#,wpf,C#,Wpf,这就是我所拥有的 <Grid.RowDefinitions> <RowDefinition Height="Auto" MinHeight="25"/> <RowDefinition Height="Auto"/> <RowDefinition /> </Grid.RowDefinitions> <Expander IsExpanded="False" Grid.Row="0" &g

这就是我所拥有的

   <Grid.RowDefinitions>
      <RowDefinition Height="Auto" MinHeight="25"/>
      <RowDefinition Height="Auto"/>
      <RowDefinition />
  </Grid.RowDefinitions>

<Expander IsExpanded="False" Grid.Row="0" >
     <DataGrid name="FirstGrid" />
</Expander>
<GridSplitter Grid.Row="1" HorizontalAlignment="Stretch"  Height="5" />
<DataGrid Grid.Row="2" name="SecondGrid" />

当我单击扩展器上的expand按钮时,它会将第0行正确地扩展到DataGrid FirstGrid的大小,并正确地折叠该行。但是,如果我展开FirstGrid,然后通过向上或向下拖动GridSplitter,然后按下展开器上的“折叠”按钮,手动调整该行的大小,则此操作不起作用。发生的情况是FirstGrid折叠,但FirstGrid所在的行本身没有折叠。有什么建议吗


谢谢

移动gridsplitter后,第一行的高度将不再是自动的,而是一个特定的值,如70。在那之后,如果那一排的孩子改变了身高,那就没关系了


将拆分器与自动大小的子行/行组合起来非常困难;您可以在Microsoft Outlook中查看侧面扩展器;我怀疑这就是你想要的。如果是这样,则不应使用扩展器,因为常规扩展器包含StackPanel,因此其子对象总是在扩展方向上自动调整大小。我不确定您想要什么,但我认为使用自定义控件是您最好的选择。

Rob是对的,一旦您移动gridsplitter,第一行的高度将不再是自动的,因此它不会响应扩展器大小的更改 为了使其工作,您需要向扩展器添加一个行为,该行为将侦听expander.expanded和collapsed事件,并再次将网格行更新为auto。大概是这样的:

public class GridColumnWidthReseterBehaviour : Behavior<Expander>
{
    private Grid _parentGrid;
    public int TargetGridRowIndex { get; set; }
    protected override void OnAttached()
    {
        AssociatedObject.Expanded += AssociatedObject_Expanded;
        AssociatedObject.Collapsed += AssociatedObject_Collapsed;
        FindParentGrid();
    }

    private void FindParentGrid()
    {
        DependencyObject parent = LogicalTreeHelper.GetParent(AssociatedObject);
        while (parent != null)
        {
            if (parent is Grid)
            {
                _parentGrid = parent as Grid;
                return;
            }
            parent = LogicalTreeHelper.GetParent(AssociatedObject);
        }
    }

    void AssociatedObject_Collapsed(object sender, System.Windows.RoutedEventArgs e)
    {
        _parentGrid.RowDefinitions[TargetGridRowIndex].Height= GridLength.Auto;
    }

    void AssociatedObject_Expanded(object sender, System.Windows.RoutedEventArgs e)
    {
        _parentGrid.RowDefinitions[TargetGridRowIndex].Height= GridLength.Auto;
    }
}
 <Expander ...>
    <interactivity:Interaction.Behaviors>
                <behaviors:GridColumnWidthReseterBehaviour TargetGridRowIndex="0"></behaviors:GridColumnWidthReseterBehaviour>
            </interactivity:Interaction.Behaviors>
公共类GridColumnWidthReseterBehaviour:行为
{
私有网格(parentGrid),;
public int TargetGridRowIndex{get;set;}
受保护的覆盖无效附加()
{
AssociatedObject.Expanded+=AssociatedObject\u Expanded;
AssociatedObject.Collapsed+=AssociatedObject\u Collapsed;
FindParentGrid();
}
私有void FindParentGrid()
{
DependencyObject parent=LogicalTreeHelper.GetParent(AssociatedObject);
while(父级!=null)
{
如果(父对象是网格)
{
_parentGrid=父网格;
返回;
}
parent=LogicalTreeHelper.GetParent(关联对象);
}
}
无效关联对象\u已折叠(对象发送方,System.Windows.RoutedEventArgs e)
{
_parentGrid.RowDefinitions[TargetGridRowIndex].Height=GridLength.Auto;
}
无效关联对象\u已展开(对象发送方,System.Windows.RoutedEventArgs e)
{
_parentGrid.RowDefinitions[TargetGridRowIndex].Height=GridLength.Auto;
}
}
你是这样使用它的:

public class GridColumnWidthReseterBehaviour : Behavior<Expander>
{
    private Grid _parentGrid;
    public int TargetGridRowIndex { get; set; }
    protected override void OnAttached()
    {
        AssociatedObject.Expanded += AssociatedObject_Expanded;
        AssociatedObject.Collapsed += AssociatedObject_Collapsed;
        FindParentGrid();
    }

    private void FindParentGrid()
    {
        DependencyObject parent = LogicalTreeHelper.GetParent(AssociatedObject);
        while (parent != null)
        {
            if (parent is Grid)
            {
                _parentGrid = parent as Grid;
                return;
            }
            parent = LogicalTreeHelper.GetParent(AssociatedObject);
        }
    }

    void AssociatedObject_Collapsed(object sender, System.Windows.RoutedEventArgs e)
    {
        _parentGrid.RowDefinitions[TargetGridRowIndex].Height= GridLength.Auto;
    }

    void AssociatedObject_Expanded(object sender, System.Windows.RoutedEventArgs e)
    {
        _parentGrid.RowDefinitions[TargetGridRowIndex].Height= GridLength.Auto;
    }
}
 <Expander ...>
    <interactivity:Interaction.Behaviors>
                <behaviors:GridColumnWidthReseterBehaviour TargetGridRowIndex="0"></behaviors:GridColumnWidthReseterBehaviour>
            </interactivity:Interaction.Behaviors>

。。。