diff --git a/src/Avalonia.Controls/ColumnDefinition.cs b/src/Avalonia.Controls/ColumnDefinition.cs index d87a683cc8..e3d2489241 100644 --- a/src/Avalonia.Controls/ColumnDefinition.cs +++ b/src/Avalonia.Controls/ColumnDefinition.cs @@ -55,11 +55,7 @@ namespace Avalonia.Controls /// /// Gets the actual calculated width of the column. /// - public double ActualWidth - { - get; - internal set; - } + public double ActualWidth => Parent?.GetFinalColumnDefinitionWidth(Index) ?? 0d; /// /// Gets or sets the maximum width of the column in DIPs. diff --git a/src/Avalonia.Controls/DefinitionBase.cs b/src/Avalonia.Controls/DefinitionBase.cs index 0c696a1035..a0b68a25a6 100644 --- a/src/Avalonia.Controls/DefinitionBase.cs +++ b/src/Avalonia.Controls/DefinitionBase.cs @@ -85,6 +85,15 @@ namespace Avalonia.Controls } } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs e) + { + if(e.Property.PropertyType == typeof(GridLength) + || e.Property.PropertyType == typeof(double)) + OnUserSizePropertyChanged(e); + + base.OnPropertyChanged(e); + } + /// /// Callback to notify about exitting model tree. /// @@ -108,7 +117,7 @@ namespace Avalonia.Controls LayoutWasUpdated = true; // defer verification for shared definitions - if (_sharedState != null) { _sharedState.EnsureDeferredValidation(grid); } + if (_sharedState != null) { _sharedState.EnsureDeferredValidation(grid); } } /// @@ -135,32 +144,28 @@ namespace Avalonia.Controls /// /// This method needs to be internal to be accessable from derived classes. /// - internal static void OnUserSizePropertyChanged(AvaloniaObject d, AvaloniaPropertyChangedEventArgs e) + internal void OnUserSizePropertyChanged(AvaloniaPropertyChangedEventArgs e) { - DefinitionBase definition = (DefinitionBase) d; - - if (definition.InParentLogicalTree) + if (InParentLogicalTree) { - if (definition._sharedState != null) + if (_sharedState != null) { - definition._sharedState.Invalidate(); + _sharedState.Invalidate(); } else { - Grid parentGrid = (Grid) definition.Parent; - - if (((GridLength) e.OldValue).GridUnitType != ((GridLength) e.NewValue).GridUnitType) + if (((GridLength)e.OldValue).GridUnitType != ((GridLength)e.NewValue).GridUnitType) { - parentGrid.Invalidate(); + Parent.Invalidate(); } else - { - parentGrid.InvalidateMeasure(); + { + Parent.InvalidateMeasure(); } } } } - + /// /// /// diff --git a/src/Avalonia.Controls/Grid.cs b/src/Avalonia.Controls/Grid.cs index 269d7a3093..1d9251076d 100644 --- a/src/Avalonia.Controls/Grid.cs +++ b/src/Avalonia.Controls/Grid.cs @@ -656,11 +656,8 @@ namespace Avalonia.Controls } // update render bound on grid lines renderer visual - GridLinesRenderer gridLinesRenderer = EnsureGridLinesRenderer(); - if (gridLinesRenderer != null) - { - gridLinesRenderer.UpdateRenderBounds(arrangeSize); - } + var gridLinesRenderer = EnsureGridLinesRenderer(); + gridLinesRenderer?.UpdateRenderBounds(arrangeSize); } } finally @@ -956,6 +953,7 @@ namespace Avalonia.Controls for(int i = 0; i < extData.DefinitionsU.Count;i++) { var definition = extData.DefinitionsU[i]; + definition.Parent = this; definition.Index = i; definition.OnEnterParentTree(); } @@ -1009,6 +1007,7 @@ namespace Avalonia.Controls for(int i = 0; i < extData.DefinitionsV.Count;i++) { var definition = extData.DefinitionsV[i]; + definition.Parent = this; definition.Index = i; definition.OnEnterParentTree(); } @@ -4075,6 +4074,7 @@ namespace Avalonia.Controls internal void UpdateRenderBounds(Size arrangeSize) { _lastArrangeSize = arrangeSize; + this.InvalidateMeasure(); this.InvalidateVisual(); } diff --git a/src/Avalonia.Controls/RowDefinition.cs b/src/Avalonia.Controls/RowDefinition.cs index f2f09f797c..ad7312d515 100644 --- a/src/Avalonia.Controls/RowDefinition.cs +++ b/src/Avalonia.Controls/RowDefinition.cs @@ -55,11 +55,7 @@ namespace Avalonia.Controls /// /// Gets the actual calculated height of the row. /// - public double ActualHeight - { - get; - internal set; - } + public double ActualHeight => Parent?.GetFinalRowDefinitionHeight(Index) ?? 0d; /// /// Gets or sets the maximum height of the row in DIPs.