using System.Windows.Media.Animation; using WPFluent.Hardware; namespace WPFluent.Animations; /// /// 提供以下工具 animation. /// /// /// TransitionAnimationProvider.ApplyTransition(MyFrameworkElement, Transition.FadeIn, 500); /// public static class TransitionAnimationProvider { private const double DecelerationRatio = 0.7D; private static void FadeInTransition(UIElement animatedUiElement, Duration duration) { var opacityDoubleAnimation = new DoubleAnimation { Duration = duration, DecelerationRatio = DecelerationRatio, From = 0.0, To = 1.0, }; animatedUiElement.BeginAnimation(UIElement.OpacityProperty, opacityDoubleAnimation); } private static void FadeInWithSlideTransition(UIElement animatedUiElement, Duration duration) { var translateDoubleAnimation = new DoubleAnimation { Duration = duration, DecelerationRatio = DecelerationRatio, From = 30, To = 0, }; if (animatedUiElement.RenderTransform is not TranslateTransform) { animatedUiElement.SetCurrentValue(UIElement.RenderTransformProperty, new TranslateTransform(0, 0)); } if (!animatedUiElement.RenderTransformOrigin.Equals(new Point(0.5, 0.5))) { animatedUiElement.SetCurrentValue(UIElement.RenderTransformOriginProperty, new Point(0.5, 0.5)); } animatedUiElement.RenderTransform.BeginAnimation(TranslateTransform.YProperty, translateDoubleAnimation); var opacityDoubleAnimation = new DoubleAnimation { Duration = duration, DecelerationRatio = DecelerationRatio, From = 0.0, To = 1.0, }; animatedUiElement.BeginAnimation(UIElement.OpacityProperty, opacityDoubleAnimation); } private static void SlideBottomTransition(UIElement animatedUiElement, Duration duration) { var translateDoubleAnimation = new DoubleAnimation { Duration = duration, DecelerationRatio = DecelerationRatio, From = 30, To = 0, }; if (animatedUiElement.RenderTransform is not TranslateTransform) { animatedUiElement.SetCurrentValue(UIElement.RenderTransformProperty, new TranslateTransform(0, 0)); } if (!animatedUiElement.RenderTransformOrigin.Equals(new Point(0.5, 0.5))) { animatedUiElement.SetCurrentValue(UIElement.RenderTransformOriginProperty, new Point(0.5, 0.5)); } animatedUiElement.RenderTransform.BeginAnimation(TranslateTransform.YProperty, translateDoubleAnimation); } private static void SlideLeftTransition(UIElement animatedUiElement, Duration duration) { var translateDoubleAnimation = new DoubleAnimation { Duration = duration, DecelerationRatio = DecelerationRatio, From = -50, To = 0, }; if (animatedUiElement.RenderTransform is not TranslateTransform) { animatedUiElement.SetCurrentValue(UIElement.RenderTransformProperty, new TranslateTransform(0, 0)); } if (!animatedUiElement.RenderTransformOrigin.Equals(new Point(0.5, 0.5))) { animatedUiElement.SetCurrentValue(UIElement.RenderTransformOriginProperty, new Point(0.5, 0.5)); } animatedUiElement.RenderTransform.BeginAnimation(TranslateTransform.XProperty, translateDoubleAnimation); } private static void SlideRightTransition(UIElement animatedUiElement, Duration duration) { var translateDoubleAnimation = new DoubleAnimation { Duration = duration, DecelerationRatio = DecelerationRatio, From = 50, To = 0, }; if (animatedUiElement.RenderTransform is not TranslateTransform) { animatedUiElement.SetCurrentValue(UIElement.RenderTransformProperty, new TranslateTransform(0, 0)); } if (!animatedUiElement.RenderTransformOrigin.Equals(new Point(0.5, 0.5))) { animatedUiElement.SetCurrentValue(UIElement.RenderTransformOriginProperty, new Point(0.5, 0.5)); } animatedUiElement.RenderTransform.BeginAnimation(TranslateTransform.XProperty, translateDoubleAnimation); } /// /// 在向帧添加内容时尝试应用动画效果。 /// /// Currently rendered element. /// Selected transition type. /// Transition duration. /// Returns if the transition was applied. Otherwise . public static bool ApplyTransition(object? element, Transition type, int duration) { if (type == Transition.None || !(RenderCapability.Tier >> 16 >= 0x1) || element is not UIElement uiElement || duration < 10) { return false; } duration = duration > 10000 ? 10000 : duration; var timespanDuration = new Duration(TimeSpan.FromMilliseconds(duration)); switch (type) { case Transition.FadeIn: FadeInTransition(uiElement, timespanDuration); break; case Transition.FadeInWithSlide: FadeInWithSlideTransition(uiElement, timespanDuration); break; case Transition.SlideBottom: SlideBottomTransition(uiElement, timespanDuration); break; case Transition.SlideRight: SlideRightTransition(uiElement, timespanDuration); break; case Transition.SlideLeft: SlideLeftTransition(uiElement, timespanDuration); break; default: return false; } return true; } }