diff --git a/src/Shared/HandyControl_Shared/Media/Animation/GeometryKeyFrame.cs b/src/Shared/HandyControl_Shared/Media/Animation/GeometryKeyFrame.cs new file mode 100644 index 00000000..fca1fe0a --- /dev/null +++ b/src/Shared/HandyControl_Shared/Media/Animation/GeometryKeyFrame.cs @@ -0,0 +1,54 @@ +using System; +using System.Windows; +using System.Windows.Media; +using System.Windows.Media.Animation; + +public abstract class GeometryKeyFrame : Freezable, IKeyFrame +{ + protected GeometryKeyFrame(Geometry value) + { + Value = value; + } + + protected GeometryKeyFrame(Geometry value, KeyTime keyTime) + { + Value = value; + KeyTime = keyTime; + } + + public static readonly DependencyProperty KeyTimeProperty = DependencyProperty.Register( + "KeyTime", typeof(KeyTime), typeof(GeometryKeyFrame), new PropertyMetadata(KeyTime.Uniform)); + + public KeyTime KeyTime + { + get => (KeyTime) GetValue(KeyTimeProperty); + set => SetValue(KeyTimeProperty, value); + } + + object IKeyFrame.Value + { + get => Value; + set => Value = (Geometry)value; + } + + public static readonly DependencyProperty ValueProperty = DependencyProperty.Register( + "Value", typeof(Geometry), typeof(GeometryKeyFrame), new PropertyMetadata(default(Geometry))); + + public Geometry Value + { + get => (Geometry) GetValue(ValueProperty); + set => SetValue(ValueProperty, value); + } + + public Geometry InterpolateValue(Geometry baseValue, double keyFrameProgress) + { + if (keyFrameProgress < 0.0 || keyFrameProgress > 1.0) + { + throw new ArgumentOutOfRangeException(nameof(keyFrameProgress)); + } + + return InterpolateValueCore(baseValue, keyFrameProgress); + } + + protected abstract Geometry InterpolateValueCore(Geometry baseValue, double keyFrameProgress); +} \ No newline at end of file