Browse Source

Make attached panel properties invalidate parent layout.

Fixes #1865.
pull/1867/head
Steven Kirk 8 years ago
parent
commit
a6a80c205c
  1. 26
      src/Avalonia.Controls/Canvas.cs
  2. 4
      src/Avalonia.Controls/DockPanel.cs
  3. 5
      src/Avalonia.Controls/Grid.cs
  4. 42
      src/Avalonia.Controls/Panel.cs

26
src/Avalonia.Controls/Canvas.cs

@ -48,7 +48,7 @@ namespace Avalonia.Controls
static Canvas() static Canvas()
{ {
ClipToBoundsProperty.OverrideDefaultValue<Canvas>(false); ClipToBoundsProperty.OverrideDefaultValue<Canvas>(false);
AffectsCanvasArrange(LeftProperty, TopProperty, RightProperty, BottomProperty); AffectsParentArrange<Canvas>(LeftProperty, TopProperty, RightProperty, BottomProperty);
} }
/// <summary> /// <summary>
@ -207,29 +207,5 @@ namespace Avalonia.Controls
return finalSize; 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();
}
} }
} }

4
src/Avalonia.Controls/DockPanel.cs

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

5
src/Avalonia.Controls/Grid.cs

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

42
src/Avalonia.Controls/Panel.cs

@ -72,6 +72,32 @@ namespace Avalonia.Controls
base.Render(context); 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> /// <summary>
/// Called when the <see cref="Children"/> collection changes. /// Called when the <see cref="Children"/> collection changes.
/// </summary> /// </summary>
@ -116,5 +142,21 @@ namespace Avalonia.Controls
InvalidateMeasure(); 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();
}
} }
} }

Loading…
Cancel
Save