在单独的线程中运行 WPF 窗口并等待其关闭

问题描述 投票:0回答:1

我需要在单击按钮时与主窗口并行运行一个新的 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;
}
c# wpf multithreading visual-studio async-await
1个回答
0
投票

如果我正确理解你需要什么,那么看看这个实现:

        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();
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.