如何"等待"关闭另一个窗口

tob*_*777 4 .net c# wpf async-await

我有很多代码看起来像这样:

MyWindow window = new MyWindow(someParam, callingWindow)
Run Code Online (Sandbox Code Playgroud)

MyWindow类包含类似的东西:

public MyWindow.Processing()
{
`  // Do processing
   ...
   callingWindow.RefreshListBox(); // Listbox for example
}
Run Code Online (Sandbox Code Playgroud)

有没有内置的方法来等待关闭窗口.我希望能够在callingWindow的类中编写类似的东西:

await mywindowInstanceCloseEvent; 
RefreshListBoxWhenWindowIsClosed();
Run Code Online (Sandbox Code Playgroud)

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

Ath*_*ari 13

你可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

await ShowPopup(new MyWindow());
Run Code Online (Sandbox Code Playgroud)

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

如果要从窗口获取结果,可以修改代码以便TaskCompletionSource<Result>正确使用.


Sri*_*vel 3

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

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