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

时间:2012-10-04 19:02:45

标签: c# wpf

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

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

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

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


更新

我尝试在GetRegisterKey的{​​{1}}事件中创建Windows_loaded的新实例,我调用了MainWindows,但它运行正常,程序没有关闭。我不知道问题的根源是什么!

但我发现问题不是来自grk.ShowDialog(),而是我会从问题中删除它的代码。

UPDATE2

我在GetRegisterKey行中设置了一个断点来检查它是否运行但它没有运行且程序已关闭!

3 个答案:

答案 0 :(得分:7)

请参阅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方法调用来停止应用程序。否则,应用程序将继续在后台运行。

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

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

答案 1 :(得分:2)

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

 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.
    }
}

答案 2 :(得分:1)

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

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