Files

116 lines
3.7 KiB
C#
Raw Permalink Normal View History

2026-04-05 17:01:20 +08:00
using System;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace Ink_Canvas.Controls
{
public partial class CopyButton : UserControl
{
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
nameof(Text), typeof(string), typeof(CopyButton), new PropertyMetadata(string.Empty));
public string Text
{
get => (string)GetValue(TextProperty);
set => SetValue(TextProperty, value);
}
public event EventHandler Click;
public CopyButton()
{
InitializeComponent();
}
private void CopyButton_Click(object sender, RoutedEventArgs e)
{
try
{
if (!string.IsNullOrEmpty(Text))
{
Clipboard.SetText(Text);
}
ShowSuccessAnimation();
Click?.Invoke(this, EventArgs.Empty);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Unable to Perform Copy", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private async void ShowSuccessAnimation()
{
var copyScaleAnim = new DoubleAnimation
{
To = 0,
Duration = TimeSpan.FromMilliseconds(150)
};
ScaleTransform_Copy.BeginAnimation(ScaleTransform.ScaleXProperty, copyScaleAnim);
var copyOpacityAnim = new DoubleAnimation
{
To = 0,
BeginTime = TimeSpan.FromMilliseconds(100),
Duration = TimeSpan.FromMilliseconds(10)
};
FontIcon_Copy.BeginAnimation(UIElement.OpacityProperty, copyOpacityAnim);
await Task.Delay(150);
var successScaleAnim = new DoubleAnimation
{
To = 1,
Duration = TimeSpan.FromMilliseconds(150),
EasingFunction = new BackEase { EasingMode = EasingMode.EaseOut, Amplitude = 0.2 }
};
ScaleTransform_Success.BeginAnimation(ScaleTransform.ScaleXProperty, successScaleAnim);
var successOpacityAnim = new DoubleAnimation
{
To = 1,
Duration = TimeSpan.FromMilliseconds(15)
};
FontIcon_Success.BeginAnimation(UIElement.OpacityProperty, successOpacityAnim);
await Task.Delay(1000);
ShowCopyAnimation();
}
private async void ShowCopyAnimation()
{
var successOpacityAnim = new DoubleAnimation
{
To = 0,
Duration = TimeSpan.FromMilliseconds(150)
};
FontIcon_Success.BeginAnimation(UIElement.OpacityProperty, successOpacityAnim);
await Task.Delay(150);
var copyScaleAnim = new DoubleAnimation
{
To = 1,
Duration = TimeSpan.Zero
};
ScaleTransform_Copy.BeginAnimation(ScaleTransform.ScaleXProperty, copyScaleAnim);
var copyOpacityAnim = new DoubleAnimation
{
To = 1,
Duration = TimeSpan.FromMilliseconds(150)
};
FontIcon_Copy.BeginAnimation(UIElement.OpacityProperty, copyOpacityAnim);
var successScaleAnim = new DoubleAnimation
{
To = 0,
Duration = TimeSpan.Zero
};
ScaleTransform_Success.BeginAnimation(ScaleTransform.ScaleXProperty, successScaleAnim);
}
}
}