当调用弹出窗口的`.ShowDialog()`时,WPF应用程序关闭

首先,我想解释一下我将要做的事情:我正在开发一个学习应用程序,向学生展示一些卡片。 我有CardPack类,是一组卡。

为了获得卡片包的许可,我想从用户那里获得一个ID,然后我创建了一个窗口来获取用户的RegisterKey。 这是我的GetRegisterKey("CardPackName")方法:

  public static string GetRegisterKey(string name) { GetRegisterKey grk = new GetRegisterKey(name); grk.ShowDialog(); return grk.Key; } 

但是在grk.ShowDialog(); 运行程序将退出,我不知道为什么! 任何人都可以帮我解决这个问题吗?!?


更新

我试图在MainWindows Windows_loaded事件中创建一个新的GetRegisterKey实例,我调用了grk.ShowDialog() ,它工作正常,程序没有关闭。 我不知道我的问题的根源是什么!

但我发现问题不是来自GetRegisterKey那么我将从问题中删除它的代码。

UPDATE2

我给了一个断点return grk.Key; 行检查它是否运行但它没有运行并且程序已关闭!

请参阅Application.ShutDownMode,

http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx

只有在调用Application的Shutdown方法时,应用程序才会停止运行。 关闭可以隐式或显式发生,由ShutdownMode属性的值指定。

如果将ShutdownMode设置为OnLastWindowClose,则Windows Presentation Foundation(WPF)会在应用程序中的最后一个窗口关闭时隐式调用Shutdown,即使当前实例化的任何窗口都设置为主窗口(请参阅MainWindow)。

OnMainWindowClose的ShutdownMode导致Windows Presentation Foundation(WPF)在MainWindow关闭时隐式调用Shutdown,即使其他窗口当前处于打开状态。

某些应用程序的生命周期可能不依赖于主窗口或最后一个窗口何时关闭,或者根本不依赖于窗口。 对于这些场景,您需要将ShutdownMode属性设置为OnExplicitShutdown,这需要显式的Shutdown方法调用来停止应用程序。 否则,应用程序将继续在后台运行。

ShutdownMode可以从XAML以声明方式配置,也可以从代码以编程方式配置。

此属性仅可从创建Application对象的线程中使用。

您是否可以在App.xaml.cs中订阅以下事件以进行调试? 它将帮助您检查堆栈跟踪并查找是否有任何未处理的exception导致此问题。

  public partial class App : Application { public App() { this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); this.Exit += new ExitEventHandler(App_Exit); } void App_Exit(object sender, ExitEventArgs e) { //Check stack trace. } void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { //Check if this event handler get executed and from where control is coming to this method. } } 

我不知道你是怎么打开GetRegistryKey窗口的,但这就是我的想法。 您可以从App.xaml文件中设置StartupUri="MainWindow.xaml" ,也可以通过编写自己的Main方法并调用application.Run(new MainWindow())来禁用它。 但是,对于任何一种情况,您都会打开MainWindow并阻止您的注册表窗口。

所以,我猜你以某种方式在MainWindow类之前创建了你的GetRegistryKey窗口。 据我所知,应用程序声称第一个创建的窗口是其主窗口。 因此,您需要在关闭之前设置Application.Current.MainWindow