using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace Common { /// /// TipMessageWindow.xaml 的交互逻辑 /// public partial class TipMessageWindow : Window { public TipMessageWindow(string message) { InitializeComponent(); MessageTextBlock.Text = message; } } public static class DialogManager { // 事件:操作完成通知 public static event Action OperationCompleted; // 显示提示窗口并等待操作完成 public static async Task ShowDialogAsync(Window owner, string message, Func operation) { var dialog = new TipMessageWindow(message); dialog.Owner = owner; // 步骤1:先订阅事件(确保操作触发事件前已订阅) var closeTask = WaitForDialogCloseAsync(dialog); // 步骤2:启动耗时操作(此时事件已订阅) var task = Task.Run(async () => { try { await operation?.Invoke(); } finally { // 操作完成(无论成功/失败)都触发关闭事件 OperationCompleted?.Invoke(); } }); // 步骤3:显示弹窗 dialog.Show(); // 步骤4:等待弹窗关闭 + 操作完成 await closeTask; await task; } private static Task WaitForDialogCloseAsync(Window dialog) { var tcs = new TaskCompletionSource(); // 定义事件处理方法(方便后续取消订阅) Action operationCompletedHandler = null; // 事件触发时关闭弹窗 operationCompletedHandler = () => { // 必须在UI线程操作弹窗 dialog.Dispatcher.Invoke(() => { if (dialog.IsVisible) dialog.Close(); }); // 取消订阅(避免重复触发) OperationCompleted -= operationCompletedHandler; }; // 订阅事件 OperationCompleted += operationCompletedHandler; // 弹窗关闭时完成Task + 取消订阅 dialog.Closed += (s, e) => { OperationCompleted -= operationCompletedHandler; tcs.SetResult(true); }; return tcs.Task; } } }