197 lines
6.9 KiB
C#
197 lines
6.9 KiB
C#
|
using System;
|
|||
|
using System.Windows;
|
|||
|
using System.Windows.Media;
|
|||
|
using System.Windows.Media.Animation;
|
|||
|
|
|||
|
namespace Ink_Canvas.Helpers
|
|||
|
{
|
|||
|
internal class AnimationHelper
|
|||
|
{
|
|||
|
public static void ShowWithSlideFromBottomAndFade(UIElement element, double duration = 0.15)
|
|||
|
{
|
|||
|
if (element.Visibility == Visibility.Visible) return;
|
|||
|
|
|||
|
if (element == null)
|
|||
|
throw new ArgumentNullException(nameof(element));
|
|||
|
|
|||
|
var sb = new Storyboard();
|
|||
|
|
|||
|
// 渐变动画
|
|||
|
var fadeInAnimation = new DoubleAnimation
|
|||
|
{
|
|||
|
From = 0.5,
|
|||
|
To = 1,
|
|||
|
Duration = TimeSpan.FromSeconds(duration)
|
|||
|
};
|
|||
|
Storyboard.SetTargetProperty(fadeInAnimation, new PropertyPath(UIElement.OpacityProperty));
|
|||
|
|
|||
|
// 滑动动画
|
|||
|
var slideAnimation = new DoubleAnimation
|
|||
|
{
|
|||
|
From = element.RenderTransform.Value.OffsetY + 10, // 滑动距离
|
|||
|
To = 0,
|
|||
|
Duration = TimeSpan.FromSeconds(duration)
|
|||
|
};
|
|||
|
Storyboard.SetTargetProperty(slideAnimation, new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.Y)"));
|
|||
|
|
|||
|
sb.Children.Add(fadeInAnimation);
|
|||
|
sb.Children.Add(slideAnimation);
|
|||
|
|
|||
|
element.Visibility = Visibility.Visible;
|
|||
|
element.RenderTransform = new TranslateTransform();
|
|||
|
|
|||
|
sb.Begin((FrameworkElement)element);
|
|||
|
}
|
|||
|
|
|||
|
public static void ShowWithSlideFromLeftAndFade(UIElement element, double duration = 0.25)
|
|||
|
{
|
|||
|
if (element.Visibility == Visibility.Visible) return;
|
|||
|
|
|||
|
if (element == null)
|
|||
|
throw new ArgumentNullException(nameof(element));
|
|||
|
|
|||
|
var sb = new Storyboard();
|
|||
|
|
|||
|
// 渐变动画
|
|||
|
var fadeInAnimation = new DoubleAnimation
|
|||
|
{
|
|||
|
From = 0.5,
|
|||
|
To = 1,
|
|||
|
Duration = TimeSpan.FromSeconds(duration)
|
|||
|
};
|
|||
|
Storyboard.SetTargetProperty(fadeInAnimation, new PropertyPath(UIElement.OpacityProperty));
|
|||
|
|
|||
|
// 滑动动画
|
|||
|
var slideAnimation = new DoubleAnimation
|
|||
|
{
|
|||
|
From = element.RenderTransform.Value.OffsetX - 20, // 滑动距离
|
|||
|
To = 0,
|
|||
|
Duration = TimeSpan.FromSeconds(duration)
|
|||
|
};
|
|||
|
Storyboard.SetTargetProperty(slideAnimation, new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.X)"));
|
|||
|
|
|||
|
sb.Children.Add(fadeInAnimation);
|
|||
|
sb.Children.Add(slideAnimation);
|
|||
|
|
|||
|
element.Visibility = Visibility.Visible;
|
|||
|
element.RenderTransform = new TranslateTransform();
|
|||
|
|
|||
|
sb.Begin((FrameworkElement)element);
|
|||
|
}
|
|||
|
|
|||
|
public static void ShowWithScaleFromLeft(UIElement element, double duration = 0.5)
|
|||
|
{
|
|||
|
if (element.Visibility == Visibility.Visible) return;
|
|||
|
|
|||
|
if (element == null)
|
|||
|
throw new ArgumentNullException(nameof(element));
|
|||
|
|
|||
|
var sb = new Storyboard();
|
|||
|
|
|||
|
// 水平方向的缩放动画
|
|||
|
var scaleXAnimation = new DoubleAnimation
|
|||
|
{
|
|||
|
From = 0,
|
|||
|
To = 1,
|
|||
|
Duration = TimeSpan.FromSeconds(duration)
|
|||
|
};
|
|||
|
Storyboard.SetTargetProperty(scaleXAnimation, new PropertyPath("(UIElement.RenderTransform).(ScaleTransform.ScaleX)"));
|
|||
|
|
|||
|
// 垂直方向的缩放动画
|
|||
|
var scaleYAnimation = new DoubleAnimation
|
|||
|
{
|
|||
|
From = 0,
|
|||
|
To = 1,
|
|||
|
Duration = TimeSpan.FromSeconds(duration)
|
|||
|
};
|
|||
|
Storyboard.SetTargetProperty(scaleYAnimation, new PropertyPath("(UIElement.RenderTransform).(ScaleTransform.ScaleY)"));
|
|||
|
|
|||
|
sb.Children.Add(scaleXAnimation);
|
|||
|
sb.Children.Add(scaleYAnimation);
|
|||
|
|
|||
|
element.Visibility = Visibility.Visible;
|
|||
|
element.RenderTransformOrigin = new Point(0, 0.5); // 左侧中心点为基准
|
|||
|
element.RenderTransform = new ScaleTransform(0, 0);
|
|||
|
|
|||
|
sb.Begin((FrameworkElement)element);
|
|||
|
}
|
|||
|
|
|||
|
public static void ShowWithScaleFromRight(UIElement element, double duration = 0.5)
|
|||
|
{
|
|||
|
if (element.Visibility == Visibility.Visible) return;
|
|||
|
|
|||
|
if (element == null)
|
|||
|
throw new ArgumentNullException(nameof(element));
|
|||
|
|
|||
|
var sb = new Storyboard();
|
|||
|
|
|||
|
// 水平方向的缩放动画
|
|||
|
var scaleXAnimation = new DoubleAnimation
|
|||
|
{
|
|||
|
From = 0,
|
|||
|
To = 1,
|
|||
|
Duration = TimeSpan.FromSeconds(duration)
|
|||
|
};
|
|||
|
Storyboard.SetTargetProperty(scaleXAnimation, new PropertyPath("(UIElement.RenderTransform).(ScaleTransform.ScaleX)"));
|
|||
|
|
|||
|
// 垂直方向的缩放动画
|
|||
|
var scaleYAnimation = new DoubleAnimation
|
|||
|
{
|
|||
|
From = 0,
|
|||
|
To = 1,
|
|||
|
Duration = TimeSpan.FromSeconds(duration)
|
|||
|
};
|
|||
|
Storyboard.SetTargetProperty(scaleYAnimation, new PropertyPath("(UIElement.RenderTransform).(ScaleTransform.ScaleY)"));
|
|||
|
|
|||
|
sb.Children.Add(scaleXAnimation);
|
|||
|
sb.Children.Add(scaleYAnimation);
|
|||
|
|
|||
|
element.Visibility = Visibility.Visible;
|
|||
|
element.RenderTransformOrigin = new Point(1, 0.5); // 右侧中心点为基准
|
|||
|
element.RenderTransform = new ScaleTransform(0, 0);
|
|||
|
|
|||
|
sb.Begin((FrameworkElement)element);
|
|||
|
}
|
|||
|
|
|||
|
public static void HideWithSlideAndFade(UIElement element, double duration = 0.15)
|
|||
|
{
|
|||
|
if (element.Visibility == Visibility.Collapsed) return;
|
|||
|
|
|||
|
if (element == null)
|
|||
|
throw new ArgumentNullException(nameof(element));
|
|||
|
|
|||
|
var sb = new Storyboard();
|
|||
|
|
|||
|
// 渐变动画
|
|||
|
var fadeOutAnimation = new DoubleAnimation
|
|||
|
{
|
|||
|
From = 1,
|
|||
|
To = 0,
|
|||
|
Duration = TimeSpan.FromSeconds(duration)
|
|||
|
};
|
|||
|
Storyboard.SetTargetProperty(fadeOutAnimation, new PropertyPath(UIElement.OpacityProperty));
|
|||
|
|
|||
|
// 滑动动画
|
|||
|
var slideAnimation = new DoubleAnimation
|
|||
|
{
|
|||
|
From = 0,
|
|||
|
To = element.RenderTransform.Value.OffsetY + 10, // 滑动距离
|
|||
|
Duration = TimeSpan.FromSeconds(duration)
|
|||
|
};
|
|||
|
Storyboard.SetTargetProperty(slideAnimation, new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.Y)"));
|
|||
|
|
|||
|
sb.Children.Add(fadeOutAnimation);
|
|||
|
sb.Children.Add(slideAnimation);
|
|||
|
|
|||
|
sb.Completed += (s, e) =>
|
|||
|
{
|
|||
|
element.Visibility = Visibility.Collapsed;
|
|||
|
};
|
|||
|
|
|||
|
element.RenderTransform = new TranslateTransform();
|
|||
|
sb.Begin((FrameworkElement)element);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|