using System; using System.Collections.Generic; using System.Windows; using System.Windows.Media.Animation; namespace SJ.Controls.Helpers { public class StoryboardHelper { /// /// 播放动画 /// /// 控件源 /// 开始值 /// 结束值 /// 时间间隔 /// 是否反向播放 /// 是否重复播放 /// 动画类型 /// 回调函数 /// 动画属性 public static void _PlayDoubleAnimation(FrameworkElement fe, double from, double to, TimeSpan duration, bool IsAutoReverse, bool RepeatPlay, IEasingFunction ef, Action Callback, string PropertyPath) { Storyboard _sb = new Storyboard(); _sb.Completed += new EventHandler((s, e) => { if (Callback != null) Callback(); _sb.Stop(); _sb.Children.Clear(); _sb = null; }); DoubleAnimation daRotation = new DoubleAnimation(); daRotation.From = from; daRotation.To = to; daRotation.EasingFunction = ef; daRotation.Duration = duration; Storyboard.SetTargetProperty(daRotation, new PropertyPath(PropertyPath)); Storyboard.SetTarget(daRotation, fe); _sb.Children.Add(daRotation); _sb.AutoReverse = IsAutoReverse; if (RepeatPlay) _sb.RepeatBehavior = RepeatBehavior.Forever; _sb.Begin(); } public static void _PlayAnimationUsingKeyFrames(IList AnimationUsingKeyFrameList, bool IsAutoReverse, bool IsRepeayPlay, Action Callback) { if (AnimationUsingKeyFrameList == null || AnimationUsingKeyFrameList.Count == 0) return; Storyboard _sb = new Storyboard(); _sb.Completed += new EventHandler((s, e) => { if (Callback != null) Callback(); _sb.Stop(); _sb.Children.Clear(); _sb = null; }); _sb.AutoReverse = IsAutoReverse; if (IsRepeayPlay) _sb.RepeatBehavior = RepeatBehavior.Forever; foreach (AnimationModel am in AnimationUsingKeyFrameList) { AnimationTimeline animationTimeLine = null; switch (am._KeyFrameType) { case KeyFrameType.DoubleKeyFrame: animationTimeLine = CreateDoubleAnimationUsingKeyFrames(am); break; case KeyFrameType.ColorKeyFrame: animationTimeLine = CreateColorAnimationUsingKeyFrames(am); break; case KeyFrameType.ObjectKeyFrame: animationTimeLine = CreateObjectAnimationUsingKeyFrames(am); break; } _sb.Children.Add(animationTimeLine); } _sb.Begin(); } private static AnimationTimeline CreateDoubleAnimationUsingKeyFrames(AnimationModel am) { DoubleAnimationUsingKeyFrames animationTimeline = new DoubleAnimationUsingKeyFrames(); Storyboard.SetTargetProperty(animationTimeline, new PropertyPath(am.PropertyPath)); Storyboard.SetTarget(animationTimeline, am.Element); foreach (BaseKeyFrame baseKeyFrame in am.KeyFrames) { animationTimeline.KeyFrames.Add( new EasingDoubleKeyFrame( Convert.ToInt32(baseKeyFrame.Value), baseKeyFrame._KeyTime, baseKeyFrame.EasingFunction) ); } return animationTimeline; } private static AnimationTimeline CreateColorAnimationUsingKeyFrames(AnimationModel am) { ColorAnimationUsingKeyFrames animationTimeline = new ColorAnimationUsingKeyFrames(); Storyboard.SetTargetProperty(animationTimeline, new PropertyPath(am.PropertyPath)); Storyboard.SetTarget(animationTimeline, am.Element); foreach (BaseKeyFrame baseKeyFrame in am.KeyFrames) { animationTimeline.KeyFrames.Add( new EasingColorKeyFrame( (System.Windows.Media.Color)baseKeyFrame.Value, baseKeyFrame._KeyTime, baseKeyFrame.EasingFunction) ); } return animationTimeline; } private static AnimationTimeline CreateObjectAnimationUsingKeyFrames(AnimationModel am) { ObjectAnimationUsingKeyFrames animationTimeline = new ObjectAnimationUsingKeyFrames(); Storyboard.SetTargetProperty(animationTimeline, new PropertyPath(am.PropertyPath)); Storyboard.SetTarget(animationTimeline, am.Element); foreach (BaseKeyFrame baseKeyFrame in am.KeyFrames) { animationTimeline.KeyFrames.Add( new DiscreteObjectKeyFrame( baseKeyFrame.Value, baseKeyFrame._KeyTime) ); } return animationTimeline; } } /// /// 关键帧动画类型 /// public enum KeyFrameType { DoubleKeyFrame = 1, ColorKeyFrame = 2, ObjectKeyFrame = 3 } public class AnimationModel { public AnimationModel() { this.KeyFrames = new List(); } /// /// 执行动画的对象 /// public FrameworkElement Element; /// /// 作用于动画的属性 /// public string PropertyPath; /// /// 动画类型枚举 /// public KeyFrameType _KeyFrameType; /// /// 关键帧动画帧集合 /// public IList KeyFrames; } public class BaseKeyFrame { /// /// 动画触发时间 /// public TimeSpan _KeyTime; /// /// 值 /// public object Value; /// /// 缓动函数类型 /// public IEasingFunction EasingFunction; } }