【问题标题】:How to "await" the closing of another window如何“等待”另一个窗口的关闭
【发布时间】:2014-10-25 10:39:17
【问题描述】:

我有很多这样的代码:

MyWindow window = new MyWindow(someParam, callingWindow)

使用包含类似内容的 MyWindow 类:

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

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

await mywindowInstanceCloseEvent; 
RefreshListBoxWhenWindowIsClosed();

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

【问题讨论】:

  • 使用Window.ShowDialog阻止调用者或使用Window.Closed事件。
  • 您的意思是要冻结父窗口还是使其在您的子窗口关闭之前无法访问?
  • ShowDialog 就是其中之一!万分感谢。将其发布为答案,我会接受它。谢谢!
  • @ngergo6 感谢您的评论,实际上我只是想阻止在调用窗口中执行进一步的指令,直到新窗口关闭。 ShowDialog() 是我所追求的

标签: c# .net wpf async-await


【解决方案1】:

您可以为此使用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&lt;Result&gt;

【讨论】:

  • 谢谢,我会记住的,以后一定会帮到我
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2022-01-07
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多