我正在开发一个WPF应用程序,我需要在主窗口关闭时完全关闭。我打开并运行的程序可以打开另一个窗口(变量名称已更改,但这是逻辑):
private void NewWindowButton_Click(object sender, RoutedEventArgs e) {
Thread WindowThread = new Thread(new ThreadStart(NewWindowThread));
WindowThread.SetApartmentState(ApartmentState.STA);
WindowThread.IsBackground = true;
WindowThread.Start();
}
private void NewWindowThread() {
var NewWindow = new NewWindow();
NewWindow.Show();
Dispatcher.Run();
}
当主窗口关闭时,我有关闭事件调用应用程序关闭方法,如下所示:
private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
Application.Current.Shutdown();
}
这将关闭在与主窗口相同的线程中创建的所有窗口,但是这并没有关闭我在新线程中打开的其他窗口。当主窗口关闭时,如何确保关闭所有窗口?
编辑:链接的帖子仅部分回答了我的问题。使用函数Environment.Exit(0);
用于关闭每个窗口,但它会导致我的所有窗口在单击X按钮后关闭大约2-3秒,而Application.Current.Shutdown();
立即关闭窗口但是离开其他线程打开。在调用Shutdown之后,同一个线程上没有任何事情发生,所以我不需要在它之后返回一个返回语句。
答案 0 :(得分:3)
您可以在关闭MainWindow时将项目属性中的ShutdownMode更改为关闭。在“Application.xaml”文件中更改
ShutdownMode="OnLastWindowClose"
到
ShutdownMode="OnMainWindowClose"
答案 1 :(得分:0)
我想出了一种方法来自己做,而不必通过创建一个线程列表来调用Environment.Exit(0);
,然后调用线程调度程序的InvokeShutdown方法。以下是上面修改后的代码:
private List<Thread> threadList = new List<Thread>();
private void NewWindowButton_Click(object sender, RoutedEventArgs e) {
Thread WindowThread = new Thread(new ThreadStart(NewWindowThread));
threadList.Add(WindowThread);
WindowThread.SetApartmentState(ApartmentState.STA);
WindowThread.IsBackground = true;
WindowThread.Start();
}
private void NewWindowThread() {
var NewWindow = new NewWindow();
NewWindow.Show();
Dispatcher.Run();
}
private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
foreach (Thread thread in threadList)
{
Dispatcher.FromThread(thread).InvokeShutdown();
}
Application.Current.Shutdown();
}
这会导致单独的线程中的所有窗口在主窗口关闭时关闭,并且不会导致像Environment.Exit(0);
那样的任何延迟。