我正在处理一个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后,同一线程上没有发生任何事情,因此我不需要在它之后使用return语句。
发布于 2016-07-26 15:59:18
您可以将项目属性中的ShutdownMode更改为在MainWindow关闭时关闭。在您的"Application.xaml“文件中更改
ShutdownMode="OnLastWindowClose"至
ShutdownMode="OnMainWindowClose"发布于 2016-07-26 10:43:08
我自己找到了一种方法,不需要调用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);那样造成任何延迟。
https://stackoverflow.com/questions/38579468
复制相似问题