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()
{
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();
}
}
}

4
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
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
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();
}
}
}

Loading…
Cancel
Save