如何“;等待”;另一扇窗户的关闭
本文关键字:一扇 窗户 等待 如何 | 更新日期: 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();
我想知道是否有一种简单的方法可以"暂停"一个方法(无论它是否异步),直到特定的窗口关闭。
您可以为此使用TaskCompletionSource
和Closed
事件。这是我使用的一种方法:
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();
}