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;
}
}
}