GeometryKeyFrame.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.Globalization;
  3. using System.Windows;
  4. using System.Windows.Media;
  5. using System.Windows.Media.Animation;
  6. using HandyControl.Tools;
  7. public abstract class GeometryKeyFrame : Freezable, IKeyFrame
  8. {
  9. internal double[] Numbers;
  10. protected GeometryKeyFrame()
  11. {
  12. }
  13. protected GeometryKeyFrame(Geometry value)
  14. {
  15. AnimationHelper.DecomposeGeometryStr(value.ToString(CultureInfo.InvariantCulture), out var arr);
  16. Numbers = arr;
  17. Value = value;
  18. }
  19. protected GeometryKeyFrame(Geometry value, KeyTime keyTime) : this(value) => KeyTime = keyTime;
  20. public static readonly DependencyProperty KeyTimeProperty = DependencyProperty.Register(
  21. nameof(KeyTime), typeof(KeyTime), typeof(GeometryKeyFrame), new PropertyMetadata(KeyTime.Uniform));
  22. public KeyTime KeyTime
  23. {
  24. get => (KeyTime) GetValue(KeyTimeProperty);
  25. set => SetValue(KeyTimeProperty, value);
  26. }
  27. object IKeyFrame.Value
  28. {
  29. get => Value;
  30. set => Value = (Geometry) value;
  31. }
  32. public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
  33. nameof(Value), typeof(Geometry), typeof(GeometryKeyFrame), new PropertyMetadata(default(Geometry), OnValueChanged));
  34. private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  35. {
  36. var obj = (GeometryKeyFrame) d;
  37. var v = (Geometry) e.NewValue;
  38. AnimationHelper.DecomposeGeometryStr(v.ToString(CultureInfo.InvariantCulture), out var arr);
  39. obj.Numbers = arr;
  40. }
  41. public Geometry Value
  42. {
  43. get => (Geometry) GetValue(ValueProperty);
  44. set => SetValue(ValueProperty, value);
  45. }
  46. public double[] InterpolateValue(double[] baseValue, double keyFrameProgress)
  47. {
  48. if (keyFrameProgress < 0.0 || keyFrameProgress > 1.0)
  49. {
  50. throw new ArgumentOutOfRangeException(nameof(keyFrameProgress));
  51. }
  52. return InterpolateValueCore(baseValue, keyFrameProgress);
  53. }
  54. protected abstract double[] InterpolateValueCore(double[] baseValue, double keyFrameProgress);
  55. }