wpf 如何“等待”另一个窗口关闭

kx1ctssn  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(244)

我有很多这样的代码:

MyWindow window = new MyWindow(someParam, callingWindow)

MyWindow类包含如下内容:

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

是否有一个内置的方法来等待窗口的关闭。我希望能够在calingWindow的类中编写类似的内容:

await mywindowInstanceCloseEvent; 
RefreshListBoxWhenWindowIsClosed();

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

ma8fv8wu

ma8fv8wu1#

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

wj8zmpe1

wj8zmpe12#

这取决于您的需要。如果您需要将窗口显示为模式对话框,请使用Window.ShowDialog。否则,您可以使用Window.Closed事件。
如果你想等待它,这里是一个good answer从@Athari。

t0ybt7op

t0ybt7op3#

谢谢你@Athari这是如此有用的使用它像showdialog在winui上:D也为创建飞溅窗口
我的代码为splashwindow使用您的答案

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

相关问题