如何“;等待”;另一扇窗户的关闭

本文关键字:一扇 窗户 等待 如何 | 更新日期: 2023-09-27 18:20:07

我有很多代码是这样的:

MyWindow window = new MyWindow(someParam, callingWindow)

有一个MyWindow类包含这样的东西:

public MyWindow.Processing()
{
`  // Do processing
   ...
   callingWindow.RefreshListBox(); // Listbox for example
}

有没有一种内置的方式来等待窗口关闭。我希望能够在callingWindow的类中写这样的东西:

await mywindowInstanceCloseEvent; 
RefreshListBoxWhenWindowIsClosed();

我想知道是否有一种简单的方法可以"暂停"一个方法(无论它是否异步),直到特定的窗口关闭。

如何“;等待”;另一扇窗户的关闭

您可以为此使用TaskCompletionSourceClosed事件。这是我使用的一种方法:

private Task ShowPopup<TPopup> (TPopup popup)
    where TPopup : Window
{
    var task = new TaskCompletionSource<object>();
    popup.Owner = Application.Current.MainWindow;
    popup.Closed += (s, a) => task.SetResult(null);
    popup.Show();
    popup.Focus();
    return task.Task;
}

你可以这样使用它:

await ShowPopup(new MyWindow());

如果希望窗口是模态的,可以用ShowDialog替换Show方法。

如果您想从窗口中获得结果,可以修改代码以适当地使用TaskCompletionSource<Result>

这取决于您的需求。如果需要将窗口显示为模式对话框,请使用Window.ShowDialog。否则,您可以使用Window.Closed事件。

如果你想等待,下面是@Athari的一个好答案。

谢谢@Athari这非常有用,可以像winui:D上的showdialog一样使用它也用于创建防溅窗

我的代码飞溅窗口使用你的答案

private void Window_Principal_Activated(object sender, WindowActivatedEventArgs e)
{
    this.Activated -= Window_Principal_Activated;
    Terminar();
}
private async void Terminar()
{
    this.Hide();
    await ShowPopup(new Window_CustomSplash());
    this.Show();
}