DrawingPropertyMetadata.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System;
  2. using System.Windows;
  3. namespace HandyControl.Expression.Media;
  4. internal class DrawingPropertyMetadata : FrameworkPropertyMetadata
  5. {
  6. #pragma warning disable 414
  7. private DrawingPropertyMetadataOptions options;
  8. #pragma warning restore 414
  9. private PropertyChangedCallback propertyChangedCallback;
  10. public static event EventHandler<DrawingPropertyChangedEventArgs> DrawingPropertyChanged;
  11. static DrawingPropertyMetadata()
  12. {
  13. DrawingPropertyChanged += delegate (object sender, DrawingPropertyChangedEventArgs args)
  14. {
  15. if ((sender is IShape shape) && args.Metadata.AffectsRender)
  16. {
  17. InvalidateGeometryReasons reasons = InvalidateGeometryReasons.PropertyChanged;
  18. if (args.IsAnimated)
  19. {
  20. reasons |= InvalidateGeometryReasons.IsAnimated;
  21. }
  22. shape.InvalidateGeometry(reasons);
  23. }
  24. };
  25. }
  26. public DrawingPropertyMetadata(object defaultValue) : this(defaultValue, DrawingPropertyMetadataOptions.None, null)
  27. {
  28. }
  29. public DrawingPropertyMetadata(PropertyChangedCallback propertyChangedCallback) : this(DependencyProperty.UnsetValue, DrawingPropertyMetadataOptions.None, propertyChangedCallback)
  30. {
  31. }
  32. private DrawingPropertyMetadata(DrawingPropertyMetadataOptions options, object defaultValue) : base(defaultValue, (FrameworkPropertyMetadataOptions) options)
  33. {
  34. }
  35. public DrawingPropertyMetadata(object defaultValue, DrawingPropertyMetadataOptions options) : this(defaultValue, options, null)
  36. {
  37. }
  38. public DrawingPropertyMetadata(object defaultValue, DrawingPropertyMetadataOptions options, PropertyChangedCallback propertyChangedCallback) : base(defaultValue, (FrameworkPropertyMetadataOptions) options, AttachCallback(defaultValue, options, propertyChangedCallback))
  39. {
  40. }
  41. private static PropertyChangedCallback AttachCallback(object defaultValue, DrawingPropertyMetadataOptions options, PropertyChangedCallback propertyChangedCallback)
  42. {
  43. DrawingPropertyMetadata metadata = new DrawingPropertyMetadata(options, defaultValue)
  44. {
  45. options = options,
  46. propertyChangedCallback = propertyChangedCallback
  47. };
  48. return metadata.InternalCallback;
  49. }
  50. private void InternalCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
  51. {
  52. if (DrawingPropertyChanged != null)
  53. {
  54. DrawingPropertyChangedEventArgs args = new DrawingPropertyChangedEventArgs
  55. {
  56. Metadata = this,
  57. IsAnimated = DependencyPropertyHelper.GetValueSource(sender, e.Property).IsAnimated
  58. };
  59. DrawingPropertyChanged(sender, args);
  60. }
  61. propertyChangedCallback?.Invoke(sender, e);
  62. }
  63. }