我需要在单击按钮时与主窗口并行运行一个新的 WPF 窗口。在前一个窗口关闭之前,不应打开另一个窗口。我发现这个答案可以在单独的线程中运行一个新窗口,并且这个答案可以等待
Closed
事件。
我尝试使用
Task
将它们组合起来,但遇到了以下问题。一个新窗口独立于主窗口打开,但 await task
不会暂停函数执行。另外,当我关闭主窗口时,会保留一个新窗口。
有人可以建议我如何解决这个问题吗?
bool signal = false;
private async void butHelp1_Click(object sender, RoutedEventArgs e)
{
// Check the global signal variable to not let a new window open
if (signal) return;
signal = true;
Task task = Task.Run(() =>
{
Thread thread = new(() =>
{
NewWindow window = new();
window.ShowDialog();
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
});
// This line does not pause the function execution
await task;
signal = false;
}
如果我正确理解你需要什么,那么看看这个实现:
private bool isClosedNewWindow = false;
private NewWindow? newWindow;
private void butHelp1_Click(object sender, RoutedEventArgs e)
{
if (isClosedNewWindow)
{
if (newWindow?.WindowState == WindowState.Minimized)
newWindow.WindowState = WindowState.Normal;
}
else
{
isClosedNewWindow = true;
newWindow = new NewWindow();
newWindow.Closed += delegate { isClosedNewWindow = false; };
newWindow.Show();
}
}