2

首先我想解释一下我要做什么:我正在开发一个学习应用程序来向学生展示一些卡片。我的CardPack课程是一组卡片。

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

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

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


更新

我试图创建一个新的GetRegisterKeyinWindows_loaded事件实例,MainWindows我打电话给grk.ShowDialog()它,它工作正常,程序没有关闭。我不知道我的问题的根源是什么!

但我发现问题不是GetRegisterKey从那时起我会从问题中删除它的代码。

更新2

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

4

3 回答 3

7

请参阅 Application.ShutDownMode,

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

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

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

OnMainWindowClose 的 ShutdownMode 会导致 Windows Presentation Foundation (WPF) 在 MainWindow 关闭时隐式调用 Shutdown,即使当前打开了其他窗口也是如此。

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

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

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

于 2012-10-04T19:24:20.417 回答
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.
    }
}
于 2012-10-07T05:03:28.057 回答
1

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

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

于 2012-10-08T17:02:14.913 回答