From a6a80c205ce351cfa8d61905b4b69cec050a1e62 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 7 Sep 2018 01:50:30 +0200 Subject: [PATCH] Make attached panel properties invalidate parent layout. Fixes #1865. --- src/Avalonia.Controls/Canvas.cs | 26 +----------------- src/Avalonia.Controls/DockPanel.cs | 4 +-- src/Avalonia.Controls/Grid.cs | 5 ++++ src/Avalonia.Controls/Panel.cs | 42 ++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/Avalonia.Controls/Canvas.cs b/src/Avalonia.Controls/Canvas.cs index 5c9a97cb27..e16a0b074b 100644 --- a/src/Avalonia.Controls/Canvas.cs +++ b/src/Avalonia.Controls/Canvas.cs @@ -48,7 +48,7 @@ namespace Avalonia.Controls static Canvas() { ClipToBoundsProperty.OverrideDefaultValue(false); - AffectsCanvasArrange(LeftProperty, TopProperty, RightProperty, BottomProperty); + AffectsParentArrange(LeftProperty, TopProperty, RightProperty, BottomProperty); } /// @@ -207,29 +207,5 @@ namespace Avalonia.Controls return finalSize; } - - /// - /// Marks a property on a child as affecting the canvas' arrangement. - /// - /// The properties. - private static void AffectsCanvasArrange(params AvaloniaProperty[] properties) - { - foreach (var property in properties) - { - property.Changed.Subscribe(AffectsCanvasArrangeInvalidate); - } - } - - /// - /// Calls on the parent of the control whose - /// property changed, if that parent is a canvas. - /// - /// The event args. - private static void AffectsCanvasArrangeInvalidate(AvaloniaPropertyChangedEventArgs e) - { - var control = e.Sender as IControl; - var canvas = control?.VisualParent as Canvas; - canvas?.InvalidateArrange(); - } } } diff --git a/src/Avalonia.Controls/DockPanel.cs b/src/Avalonia.Controls/DockPanel.cs index 66e84c1110..e147fe1a52 100644 --- a/src/Avalonia.Controls/DockPanel.cs +++ b/src/Avalonia.Controls/DockPanel.cs @@ -37,7 +37,7 @@ namespace Avalonia.Controls /// static DockPanel() { - AffectsArrange(DockProperty); + AffectsParentMeasure(DockProperty); } /// @@ -173,4 +173,4 @@ namespace Avalonia.Controls return arrangeSize; } } -} \ No newline at end of file +} diff --git a/src/Avalonia.Controls/Grid.cs b/src/Avalonia.Controls/Grid.cs index 5f194bdd71..1a07ccaf7e 100644 --- a/src/Avalonia.Controls/Grid.cs +++ b/src/Avalonia.Controls/Grid.cs @@ -48,6 +48,11 @@ namespace Avalonia.Controls private RowDefinitions _rowDefinitions; + static Grid() + { + AffectsParentMeasure(ColumnProperty, ColumnSpanProperty, RowProperty, RowSpanProperty); + } + /// /// Gets or sets the columns definitions for the grid. /// diff --git a/src/Avalonia.Controls/Panel.cs b/src/Avalonia.Controls/Panel.cs index a2cb013300..c0d211effb 100644 --- a/src/Avalonia.Controls/Panel.cs +++ b/src/Avalonia.Controls/Panel.cs @@ -72,6 +72,32 @@ namespace Avalonia.Controls base.Render(context); } + /// + /// Marks a property on a child as affecting the parent panel's arrangement. + /// + /// The properties. + protected static void AffectsParentArrange(params AvaloniaProperty[] properties) + where TPanel : class, IPanel + { + foreach (var property in properties) + { + property.Changed.Subscribe(AffectsParentArrangeInvalidate); + } + } + + /// + /// Marks a property on a child as affecting the parent panel's measurement. + /// + /// The properties. + protected static void AffectsParentMeasure(params AvaloniaProperty[] properties) + where TPanel : class, IPanel + { + foreach (var property in properties) + { + property.Changed.Subscribe(AffectsParentMeasureInvalidate); + } + } + /// /// Called when the collection changes. /// @@ -116,5 +142,21 @@ namespace Avalonia.Controls InvalidateMeasure(); } + + private static void AffectsParentArrangeInvalidate(AvaloniaPropertyChangedEventArgs e) + where TPanel : class, IPanel + { + var control = e.Sender as IControl; + var panel = control?.VisualParent as TPanel; + panel?.InvalidateArrange(); + } + + private static void AffectsParentMeasureInvalidate(AvaloniaPropertyChangedEventArgs e) + where TPanel : class, IPanel + { + var control = e.Sender as IControl; + var panel = control?.VisualParent as TPanel; + panel?.InvalidateMeasure(); + } } }