|
|
|
@ -1,5 +1,4 @@ |
|
|
|
using System; |
|
|
|
using Avalonia.Data; |
|
|
|
using Avalonia.Media; |
|
|
|
|
|
|
|
namespace Avalonia.Controls.Shapes |
|
|
|
@ -9,6 +8,8 @@ namespace Avalonia.Controls.Shapes |
|
|
|
public static readonly StyledProperty<Geometry> DataProperty = |
|
|
|
AvaloniaProperty.Register<Path, Geometry>(nameof(Data)); |
|
|
|
|
|
|
|
private EventHandler _geometryChangedHandler; |
|
|
|
|
|
|
|
static Path() |
|
|
|
{ |
|
|
|
AffectsGeometry<Path>(DataProperty); |
|
|
|
@ -21,21 +22,48 @@ namespace Avalonia.Controls.Shapes |
|
|
|
set { SetValue(DataProperty, value); } |
|
|
|
} |
|
|
|
|
|
|
|
private EventHandler GeometryChangedHandler => _geometryChangedHandler ??= GeometryChanged; |
|
|
|
|
|
|
|
protected override Geometry CreateDefiningGeometry() => Data; |
|
|
|
|
|
|
|
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) |
|
|
|
{ |
|
|
|
base.OnAttachedToVisualTree(e); |
|
|
|
|
|
|
|
if (Data is object) |
|
|
|
{ |
|
|
|
Data.Changed += GeometryChangedHandler; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) |
|
|
|
{ |
|
|
|
base.OnDetachedFromVisualTree(e); |
|
|
|
|
|
|
|
if (Data is object) |
|
|
|
{ |
|
|
|
Data.Changed -= GeometryChangedHandler; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void DataChanged(AvaloniaPropertyChangedEventArgs e) |
|
|
|
{ |
|
|
|
if (VisualRoot is null) |
|
|
|
{ |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
var oldGeometry = (Geometry)e.OldValue; |
|
|
|
var newGeometry = (Geometry)e.NewValue; |
|
|
|
|
|
|
|
if (oldGeometry is object) |
|
|
|
{ |
|
|
|
oldGeometry.Changed -= GeometryChanged; |
|
|
|
oldGeometry.Changed -= GeometryChangedHandler; |
|
|
|
} |
|
|
|
|
|
|
|
if (newGeometry is object) |
|
|
|
{ |
|
|
|
newGeometry.Changed += GeometryChanged; |
|
|
|
newGeometry.Changed += GeometryChangedHandler; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|