如果我打开另一个窗口,我的WPF应用仍在运行

时间:2009-07-12 14:38:05

标签: c# wpf

我正在使用mvvm工具库编写WPF应用程序。

在主窗口中,我在一个按钮中有一个命令,使用以下命令打开另一个窗口:

catView.ShowDialog();

好吧,我关闭那个窗口(使用关闭按钮或X),当我关闭主窗口时,应用程序仍在运行,我必须将其杀死。

如果我没有打开第二个窗口,应用程序会正常关闭。

为什么我打开另一个窗口我无法正常关闭应用程序?

我在第二个窗口的关闭按钮中有这个:

this.DialogResult = true;
this.Close();

另一方面,我以这种方式启动应用程序(mvvm toolkit方式):

Views.MainView view = new Views.MainView();
view.DataContext = new ViewModels.MainViewModel();
view.Show();

非常感谢。

3 个答案:

答案 0 :(得分:3)

Nir是正确的,一个线程可能仍然在你的另一个窗口中运行。

您可以通过在窗口关闭时终止应用程序的线程调度程序来解决此问题。

public Window1()
{
    InitializeComponent();

    // This line should fix it:
    this.Closed += (sender, e) => this.Dispatcher.InvokeShutdown();
}

如果这不是正确的做事方式,我很乐意得到纠正。虽然工作得很好。

PS。 如果您的其他窗口设计为在不同的线程中运行,请阅读Eugene Prystupa: running-wpf-application-with-multiple-ui-threads

答案 1 :(得分:2)

问题可能与打开和关闭窗口无关,但在窗口内是一些东西。

当你关闭应用程序时还有另一个线程仍在运行时,通常会发生这种情况,检查可能在窗口代码中创建新线程的任何内容(包括System.Threading.Thread,ThreadPool,BackgroundWorker和第三方组件),确保在关闭应用程序之前关闭所有后台线程(或者如果你不能将它们关闭,至少将它们标记为后台线程)。

同时寻找可以打开另一个(不可见)窗口的任何东西,通常将窗口消息用作不可见窗口作为进程间通信机制,再次查找可能正在执行此操作的第三方代码。

答案 2 :(得分:1)

我不知道这是否会导致您的问题,但您不需要在第二个窗口中调用Close()。设置DialogResult会自动关闭窗口。