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

时间:2015-01-22 17:37:02

标签: c# wpf

这就是我所拥有的

   <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所在的行本身没有。有什么建议吗?

由于

2 个答案:

答案 0 :(得分:2)

Rob是对的,一旦你移动了网格探测器,第一行的高度将不再是自动,所以它不会响应扩展器大小的变化 为了使其工作,您需要向扩展器添加一个行为,该行为将侦听expandder.expanded和collapsed事件并将网格行更新为再次自动。像这样的东西:

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>

...

答案 1 :(得分:0)

一旦你移动了网格探测器,第一行的高度将不再是自动,而是一个特定值,如70.之后,如果该行中的某个孩子改变其高度并不重要。

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