Browse Source

Make attached panel properties invalidate parent layout.

Fixes #1865.
Steven Kirk 7 years ago
parent
commit
a6a80c205c

+ 1 - 25
src/Avalonia.Controls/Canvas.cs

@@ -48,7 +48,7 @@ namespace Avalonia.Controls
         static Canvas()
         {
             ClipToBoundsProperty.OverrideDefaultValue<Canvas>(false);
-            AffectsCanvasArrange(LeftProperty, TopProperty, RightProperty, BottomProperty);
+            AffectsParentArrange<Canvas>(LeftProperty, TopProperty, RightProperty, BottomProperty);
         }
 
         /// <summary>
@@ -207,29 +207,5 @@ namespace Avalonia.Controls
 
             return finalSize;
         }
-
-        /// <summary>
-        /// Marks a property on a child as affecting the canvas' arrangement.
-        /// </summary>
-        /// <param name="properties">The properties.</param>
-        private static void AffectsCanvasArrange(params AvaloniaProperty[] properties)
-        {
-            foreach (var property in properties)
-            {
-                property.Changed.Subscribe(AffectsCanvasArrangeInvalidate);
-            }
-        }
-
-        /// <summary>
-        /// Calls <see cref="Layoutable.InvalidateArrange"/> on the parent of the control whose
-        /// property changed, if that parent is a canvas.
-        /// </summary>
-        /// <param name="e">The event args.</param>
-        private static void AffectsCanvasArrangeInvalidate(AvaloniaPropertyChangedEventArgs e)
-        {
-            var control = e.Sender as IControl;
-            var canvas = control?.VisualParent as Canvas;
-            canvas?.InvalidateArrange();
-        }
     }
 }

+ 2 - 2
src/Avalonia.Controls/DockPanel.cs

@@ -37,7 +37,7 @@ namespace Avalonia.Controls
         /// </summary>
         static DockPanel()
         {
-            AffectsArrange(DockProperty);
+            AffectsParentMeasure<DockPanel>(DockProperty);
         }
 
         /// <summary>
@@ -173,4 +173,4 @@ namespace Avalonia.Controls
             return arrangeSize;
         }
     }
-}
+}

+ 5 - 0
src/Avalonia.Controls/Grid.cs

@@ -48,6 +48,11 @@ namespace Avalonia.Controls
 
         private RowDefinitions _rowDefinitions;
 
+        static Grid()
+        {
+            AffectsParentMeasure<Grid>(ColumnProperty, ColumnSpanProperty, RowProperty, RowSpanProperty);
+        }
+
         /// <summary>
         /// Gets or sets the columns definitions for the grid.
         /// </summary>

+ 42 - 0
src/Avalonia.Controls/Panel.cs

@@ -72,6 +72,32 @@ namespace Avalonia.Controls
             base.Render(context);
         }
 
+        /// <summary>
+        /// Marks a property on a child as affecting the parent panel's arrangement.
+        /// </summary>
+        /// <param name="properties">The properties.</param>
+        protected static void AffectsParentArrange<TPanel>(params AvaloniaProperty[] properties)
+            where TPanel : class, IPanel
+        {
+            foreach (var property in properties)
+            {
+                property.Changed.Subscribe(AffectsParentArrangeInvalidate<TPanel>);
+            }
+        }
+
+        /// <summary>
+        /// Marks a property on a child as affecting the parent panel's measurement.
+        /// </summary>
+        /// <param name="properties">The properties.</param>
+        protected static void AffectsParentMeasure<TPanel>(params AvaloniaProperty[] properties)
+            where TPanel : class, IPanel
+        {
+            foreach (var property in properties)
+            {
+                property.Changed.Subscribe(AffectsParentMeasureInvalidate<TPanel>);
+            }
+        }
+
         /// <summary>
         /// Called when the <see cref="Children"/> collection changes.
         /// </summary>
@@ -116,5 +142,21 @@ namespace Avalonia.Controls
 
             InvalidateMeasure();
         }
+
+        private static void AffectsParentArrangeInvalidate<TPanel>(AvaloniaPropertyChangedEventArgs e)
+            where TPanel : class, IPanel
+        {
+            var control = e.Sender as IControl;
+            var panel = control?.VisualParent as TPanel;
+            panel?.InvalidateArrange();
+        }
+
+        private static void AffectsParentMeasureInvalidate<TPanel>(AvaloniaPropertyChangedEventArgs e)
+            where TPanel : class, IPanel
+        {
+            var control = e.Sender as IControl;
+            var panel = control?.VisualParent as TPanel;
+            panel?.InvalidateMeasure();
+        }
     }
 }