优化更新代码,添加界面功能并整合
This commit is contained in:
40
WPFluent/Animations/Transition.cs
Normal file
40
WPFluent/Animations/Transition.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
|
||||
|
||||
|
||||
namespace WPFluent.Animations;
|
||||
|
||||
/// <summary>
|
||||
/// Available types of transitions.
|
||||
/// </summary>
|
||||
public enum Transition
|
||||
{
|
||||
/// <summary>
|
||||
/// None.
|
||||
/// </summary>
|
||||
None,
|
||||
|
||||
/// <summary>
|
||||
/// Change opacity.
|
||||
/// </summary>
|
||||
FadeIn,
|
||||
|
||||
/// <summary>
|
||||
/// Change opacity and slide from bottom.
|
||||
/// </summary>
|
||||
FadeInWithSlide,
|
||||
|
||||
/// <summary>
|
||||
/// Slide from bottom.
|
||||
/// </summary>
|
||||
SlideBottom,
|
||||
|
||||
/// <summary>
|
||||
/// Slide from the right side.
|
||||
/// </summary>
|
||||
SlideRight,
|
||||
|
||||
/// <summary>
|
||||
/// Slide from the left side.
|
||||
/// </summary>
|
||||
SlideLeft,
|
||||
}
|
||||
181
WPFluent/Animations/TransitionAnimationProvider.cs
Normal file
181
WPFluent/Animations/TransitionAnimationProvider.cs
Normal file
@@ -0,0 +1,181 @@
|
||||
using WPFluent.Hardware;
|
||||
|
||||
using System.Windows.Media.Animation;
|
||||
|
||||
namespace WPFluent.Animations;
|
||||
|
||||
/// <summary>
|
||||
/// Provides tools for <see cref="FrameworkElement"/> animation.
|
||||
/// </summary>
|
||||
/// <example>
|
||||
/// <code lang="csharp">TransitionAnimationProvider.ApplyTransition(MyFrameworkElement, Transition.FadeIn, 500);</code>
|
||||
/// </example>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to apply an animation effect while adding content to the frame.
|
||||
/// </summary>
|
||||
/// <param name="element">Currently rendered element.</param>
|
||||
/// <param name="type">Selected transition type.</param>
|
||||
/// <param name="duration">Transition duration.</param>
|
||||
/// <returns>Returns <see langword="true"/> if the transition was applied. Otherwise <see langword="false"/>.</returns>
|
||||
public static bool ApplyTransition(object? element, Transition type, int duration)
|
||||
{
|
||||
if(type == Transition.None ||
|
||||
!HardwareAcceleration.IsSupported(RenderingTier.PartialAcceleration) ||
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user