Files
HandyControl/src/Shared/HandyControl_Shared/Expression/Media/DrawingPropertyMetadata.cs
T

78 lines
3.0 KiB
C#

using System;
using System.Windows;
namespace HandyControl.Expression.Media
{
internal class DrawingPropertyMetadata : FrameworkPropertyMetadata
{
#pragma warning disable 414
private DrawingPropertyMetadataOptions options;
#pragma warning restore 414
private PropertyChangedCallback propertyChangedCallback;
public static event EventHandler<DrawingPropertyChangedEventArgs> DrawingPropertyChanged;
static DrawingPropertyMetadata()
{
DrawingPropertyChanged += delegate (object sender, DrawingPropertyChangedEventArgs args)
{
if ((sender is IShape shape) && args.Metadata.AffectsRender)
{
InvalidateGeometryReasons reasons = InvalidateGeometryReasons.PropertyChanged;
if (args.IsAnimated)
{
reasons |= InvalidateGeometryReasons.IsAnimated;
}
shape.InvalidateGeometry(reasons);
}
};
}
public DrawingPropertyMetadata(object defaultValue) : this(defaultValue, DrawingPropertyMetadataOptions.None, null)
{
}
public DrawingPropertyMetadata(PropertyChangedCallback propertyChangedCallback) : this(DependencyProperty.UnsetValue, DrawingPropertyMetadataOptions.None, propertyChangedCallback)
{
}
private DrawingPropertyMetadata(DrawingPropertyMetadataOptions options, object defaultValue) : base(defaultValue, (FrameworkPropertyMetadataOptions) options)
{
}
public DrawingPropertyMetadata(object defaultValue, DrawingPropertyMetadataOptions options) : this(defaultValue, options, null)
{
}
public DrawingPropertyMetadata(object defaultValue, DrawingPropertyMetadataOptions options, PropertyChangedCallback propertyChangedCallback) : base(defaultValue, (FrameworkPropertyMetadataOptions) options, AttachCallback(defaultValue, options, propertyChangedCallback))
{
}
private static PropertyChangedCallback AttachCallback(object defaultValue, DrawingPropertyMetadataOptions options, PropertyChangedCallback propertyChangedCallback)
{
DrawingPropertyMetadata metadata = new DrawingPropertyMetadata(options, defaultValue)
{
options = options,
propertyChangedCallback = propertyChangedCallback
};
return metadata.InternalCallback;
}
private void InternalCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (DrawingPropertyChanged != null)
{
DrawingPropertyChangedEventArgs args = new DrawingPropertyChangedEventArgs
{
Metadata = this,
IsAnimated = DependencyPropertyHelper.GetValueSource(sender, e.Property).IsAnimated
};
DrawingPropertyChanged(sender, args);
}
propertyChangedCallback?.Invoke(sender, e);
}
}
}