using System.Windows; using PopupWindowViewModel = XFEToolBox.Client.ViewModel.Windows.PopupWindowViewModel; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using XFEToolBox.Client.Model; using XFEToolBox.Client.Utilities; using XFEToolBox.WpfCore.Windowing; namespace XFEToolBox.Client.Views.Windows; /// /// PopupWindow.xaml 的交互逻辑 /// public partial class PopupWindow : Window { private bool isClosing; public PopupWindowViewModel ViewModel { get; set; } public MessageBoxResult? Result { get; set; } public PopupWindow() { DataContext = ViewModel = new(this); InitializeComponent(); WindowWorkAreaHelper.Attach(this); } /// /// 将通用显示选项应用到弹窗外壳。 /// public void ApplyOptions(PopupWindowOptions options) { Width = options.Width; Height = options.Height; Owner = options.Owner; ViewModel.PopupTitle = options.Title; ViewModel.PopupSubtitle = options.Subtitle; ViewModel.ContentMargin = options.ContentMargin; ViewModel.CloseButtonVisibility = options.ShowCloseButton ? Visibility.Visible : Visibility.Collapsed; ViewModel.MoveButtonVisibility = options.ShowDragBar ? Visibility.Visible : Visibility.Collapsed; } /// /// 带退出动画关闭弹窗,并把业务结果返回给调用方。 /// public async Task CloseWithResultAsync(MessageBoxResult result) { if (isClosing) return; isClosing = true; Result = result; var easing = new CubicEase { EasingMode = EasingMode.EaseIn }; BeginAnimation(OpacityProperty, new DoubleAnimation(Opacity, 0, TimeSpan.FromMilliseconds(150)) { EasingFunction = easing }); if (PopupSurface.RenderTransform is TransformGroup transformGroup) { var scale = (ScaleTransform)transformGroup.Children[0]; scale.BeginAnimation(ScaleTransform.ScaleXProperty, new DoubleAnimation(1, 0.97, TimeSpan.FromMilliseconds(150)) { EasingFunction = easing }); scale.BeginAnimation(ScaleTransform.ScaleYProperty, new DoubleAnimation(1, 0.97, TimeSpan.FromMilliseconds(150)) { EasingFunction = easing }); } await Task.Delay(150); Close(); } private void Window_Loaded(object sender, RoutedEventArgs e) { var easing = new CubicEase { EasingMode = EasingMode.EaseOut }; BeginAnimation(OpacityProperty, new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(220)) { EasingFunction = easing }); if (PopupSurface.RenderTransform is not TransformGroup transformGroup) return; var scale = (ScaleTransform)transformGroup.Children[0]; var translation = (TranslateTransform)transformGroup.Children[1]; scale.BeginAnimation(ScaleTransform.ScaleXProperty, new DoubleAnimation(0.96, 1, TimeSpan.FromMilliseconds(250)) { EasingFunction = easing }); scale.BeginAnimation(ScaleTransform.ScaleYProperty, new DoubleAnimation(0.96, 1, TimeSpan.FromMilliseconds(250)) { EasingFunction = easing }); translation.BeginAnimation(TranslateTransform.YProperty, new DoubleAnimation(12, 0, TimeSpan.FromMilliseconds(250)) { EasingFunction = easing }); } private async void Window_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key != Key.Escape || ViewModel.CloseButtonVisibility != Visibility.Visible) return; e.Handled = true; await CloseWithResultAsync(MessageBoxResult.None); } private async void CaptionBar_CloseRequested(object? sender, EventArgs e) => await CloseWithResultAsync(MessageBoxResult.None); }