Bläddra i källkod

Fixes to tree grid summary stuff when reloading a tree grid

Kenric Nugteren 7 månader sedan
förälder
incheckning
ef0efe1e55
1 ändrade filer med 48 tillägg och 34 borttagningar
  1. 48 34
      inabox.wpf/DynamicGrid/UIComponent/DynamicGridTreeUIComponent.cs

+ 48 - 34
inabox.wpf/DynamicGrid/UIComponent/DynamicGridTreeUIComponent.cs

@@ -272,15 +272,18 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
         _tree.SizeChanged += _tree_SizeChanged;
     }
 
-
+    private System.Windows.Controls.ScrollChangedEventHandler? _summaryScrollChangedHandler;
 
     private void _tree_Loaded(object sender, RoutedEventArgs e)
     {
         Application.Current.Dispatcher.BeginInvoke(() =>
         {
-
-            _summaryRow = new Grid();
-            _summaryRow.Visibility = Nodes is not null && Summaries.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
+            var firstTime = _summaryRow is null;
+            if (firstTime)
+            {
+                _summaryRow = new Grid();
+                _summaryRow.Visibility = Nodes is not null && Summaries.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
+            }
 
             var scroll = _tree.FindChild<ScrollViewer>("PART_ScrollViewer");
             if(scroll is not null)
@@ -288,47 +291,59 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                 var grid = scroll.FindVisualChildren<Grid>(recursive: false).FirstOrDefault();
                 if(grid is not null)
                 {
-                    var row1 = grid.RowDefinitions[0];
-                    var row2 = grid.RowDefinitions[1];
-                    grid.RowDefinitions.Clear();
-                    grid.RowDefinitions.Add(row1);
-                    var rowDef = grid.AddRow(GridUnitType.Auto);
+                    if (firstTime)
+                    {
+                        var row1 = grid.RowDefinitions[0];
+                        var row2 = grid.RowDefinitions[1];
+                        grid.RowDefinitions.Clear();
+                        grid.RowDefinitions.Add(row1);
+                        var rowDef = grid.AddRow(GridUnitType.Auto);
 
-                    grid.RowDefinitions.Add(row2);
+                        grid.RowDefinitions.Add(row2);
 
-                    foreach(var child in grid.Children.OfType<UIElement>())
-                    {
-                        var row = Grid.GetRow(child);
-                        if(row >= 1)
+                        foreach(var child in grid.Children.OfType<UIElement>())
                         {
-                            Grid.SetRow(child, row + 1);
-                        }
-                        else
-                        {
-                            var rowSpan = Grid.GetRowSpan(child);
-                            if(row + rowSpan >= 1 && child is ScrollBar)
+                            var row = Grid.GetRow(child);
+                            if(row >= 1)
+                            {
+                                Grid.SetRow(child, row + 1);
+                            }
+                            else
                             {
-                                Grid.SetRowSpan(child, rowSpan + 1);
+                                var rowSpan = Grid.GetRowSpan(child);
+                                if(row + rowSpan >= 1 && child is ScrollBar)
+                                {
+                                    Grid.SetRowSpan(child, rowSpan + 1);
+                                }
                             }
                         }
                     }
-                    var horizontalScrollbar = grid.Children.OfType<ScrollBar>().First(x => x.Orientation == Orientation.Horizontal);
 
                     var treeGridPanel = scroll.FindChild<TreeGridPanel>("PART_TreeGridPanel");
 
-                    var summaryScroll = new ScrollViewer
+                    var summaryScroll = grid.FindChild<ScrollViewer>("PART_SummaryScroll");
+                    if (summaryScroll is null)
                     {
-                        VerticalScrollBarVisibility = ScrollBarVisibility.Hidden,
-                        HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden
-                    };
-                    summaryScroll.Content = _summaryRow;
+                        summaryScroll = new ScrollViewer
+                        {
+                            VerticalScrollBarVisibility = ScrollBarVisibility.Hidden,
+                            HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden,
+                            Name = "PART_SummaryScroll"
+                        };
+                        summaryScroll.Content = _summaryRow;
 
-                    scroll.ScrollChanged += (o, e) =>
-                    {
-                        summaryScroll.ScrollToHorizontalOffset(scroll.HorizontalOffset);
+                        if(_summaryScrollChangedHandler is not null)
+                        {
+                            scroll.ScrollChanged -= _summaryScrollChangedHandler;
+                        }
+                        _summaryScrollChangedHandler = (o, e) =>
+                        {
+                            summaryScroll.ScrollToHorizontalOffset(scroll.HorizontalOffset);
+                        };
+                        scroll.ScrollChanged += _summaryScrollChangedHandler;
 
-                        var panel = treeGridPanel;
-                    };
+                        grid.AddChild(summaryScroll, 1, 0);
+                    }
 
                     var transform = new TranslateTransform();
                     summaryScroll.RenderTransform = transform;
@@ -355,8 +370,7 @@ public class DynamicGridTreeUIComponent<T> : IDynamicGridUIComponent<T>, IDynami
                     {
                         UpdateSize(treeGridPanel.ActualHeight);
                     };
-
-                    grid.AddChild(summaryScroll, 1, 0);
+                    UpdateSize(treeGridPanel.ActualHeight);
                 }
             }