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

时间:2014-09-01 08:32:44

标签: c# .net wpf async-await

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

MyWindow window = new MyWindow(someParam, callingWindow)

MyWindow类包含类似的内容:

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

是否有内置方式等待关闭窗口。我希望能够在调用Windows的类中编写类似的内容:

await mywindowInstanceCloseEvent; 
RefreshListBoxWhenWindowIsClosed();

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

2 个答案:

答案 0 :(得分:12)

您可以使用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());

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

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

答案 1 :(得分:3)

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

如果你想等待它,这是来自@Athari的good answer