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

WPF Expander - when GridSplitter used to manually resize row, row does not properly collapse

这就是我的

   <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" />

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

谢谢

一旦你移动gridsplitter,第一行的高度就不再是Auto,而是一个特定的值,比如70。之后那行有没有child就没关系了改变它的高度。

将分离器与一些 auto-sized child/row 结合起来非常困难;您可以查看 Microsoft Outlook 中的侧边扩展器;我怀疑这就是你想要的。如果是这样,您不应该使用扩展器,因为常规扩展器包含 StackPanel,所以它的 children 在扩展方向上总是 auto-sizing。我不确定您想要什么,但我认为使用自定义控件是您的最佳选择。

Rob说得对,一旦你移动了gridsplitter,第一行的Height就不再是Auto了,所以它不会响应expander尺寸的变化 为了让它工作,您需要向扩展器添加一个行为,它将监听 expander.expanded 和折叠事件并将网格行再次更新为自动。像这样:

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>

...