Expanders in Grid

后端 未结 2 1484
野的像风
野的像风 2021-02-01 07:43

This is going to be straight forward no doubt, but for what ever reason, my mind is drawing a blank on it.

I\'ve got a small, non-resizeable window (325x450) which has 3

2条回答
  •  萌比男神i
    2021-02-01 08:09

    This requirement is a little unusal because the you want the state of the Children in the Grid to decide the Height of the RowDefinition they are in.
    I really like the layout idea though and I can't believe I never had a similar requirement myself.. :)

    For a reusable solution I would use an Attached Behavior for the Grid.
    The behavior will subscribe to the Attached Events Expander.Expanded and Expander.Collapsed and in the event handlers, get the right RowDefinition from Grid.GetRow and update the Height accordingly. It works like this

    
        
            
            
            
        
        
        
        
        
    
    

    And here is GridExpanderSizeBehavior

    public class GridExpanderSizeBehavior
    {
        public static DependencyProperty SizeRowsToExpanderStateProperty =
            DependencyProperty.RegisterAttached("SizeRowsToExpanderState",
                                                typeof(bool),
                                                typeof(GridExpanderSizeBehavior),
                                                new FrameworkPropertyMetadata(false, SizeRowsToExpanderStateChanged));
        public static void SetSizeRowsToExpanderState(Grid grid, bool value)
        {
            grid.SetValue(SizeRowsToExpanderStateProperty, value);
        }
        private static void SizeRowsToExpanderStateChanged(object target, DependencyPropertyChangedEventArgs e)
        {
            Grid grid = target as Grid;
            if (grid != null)
            {
                if ((bool)e.NewValue == true)
                {
                    grid.AddHandler(Expander.ExpandedEvent, new RoutedEventHandler(Expander_Expanded));
                    grid.AddHandler(Expander.CollapsedEvent, new RoutedEventHandler(Expander_Collapsed));
                }
                else if ((bool)e.OldValue == true)
                {
                    grid.RemoveHandler(Expander.ExpandedEvent, new RoutedEventHandler(Expander_Expanded));
                    grid.RemoveHandler(Expander.CollapsedEvent, new RoutedEventHandler(Expander_Collapsed));
                }
            }
        }
        private static void Expander_Expanded(object sender, RoutedEventArgs e)
        {
            Grid grid = sender as Grid;
            Expander expander = e.OriginalSource as Expander;
            int row = Grid.GetRow(expander);
            if (row <= grid.RowDefinitions.Count)
            {
                grid.RowDefinitions[row].Height = new GridLength(1.0, GridUnitType.Star); 
            }
        }
        private static void Expander_Collapsed(object sender, RoutedEventArgs e)
        {
            Grid grid = sender as Grid;
            Expander expander = e.OriginalSource as Expander;
            int row = Grid.GetRow(expander);
            if (row <= grid.RowDefinitions.Count)
            {
                grid.RowDefinitions[row].Height = new GridLength(1.0, GridUnitType.Auto);
            }
        }
    }
    

提交回复
热议问题