C# 调用弹出窗口的“.ShowDialog()”时,WPF应用程序关闭

C# 调用弹出窗口的“.ShowDialog()”时,WPF应用程序关闭,c#,wpf,C#,Wpf,首先,我想解释一下我要做什么:我正在开发一个学习应用程序,向学生展示一些卡片。我有一个卡片组CardPack类 为了授权卡包,我想从用户那里获得一个ID,然后我创建了一个windows来从用户那里获得RegisterKey。这是我的GetRegisterKey(“CardPackName”)方法: public static string GetRegisterKey(string name) { GetRegisterKey grk = new GetRegis

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

为了授权卡包,我想从用户那里获得一个ID,然后我创建了一个windows来从用户那里获得RegisterKey。这是我的
GetRegisterKey(“CardPackName”)
方法:

    public static string GetRegisterKey(string name)
    {
        GetRegisterKey grk = new GetRegisterKey(name);
        grk.ShowDialog();
        return grk.Key;
    }
但是在
grk.ShowDialog()之后运行要退出的程序,我不知道为什么谁能帮我解决这个问题


更新

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

但是我发现问题不是来自
GetRegisterKey
,然后我将从问题中删除它的代码

更新2


我在
return grk.Key中放了一个断点行以检查它是否运行但未运行且程序已关闭

参见Application.ShutDownMode

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

如果将关闭模式设置为OnLaStoundWOWORKOFF,Windows演示基础(WPF)在应用程序中的最后一个窗口关闭时会隐式调用关机,即使任何当前实例化的窗口都设置为主窗口(见MainWindow)。

一个OnMeNistWORKOND的关闭模式导致Windows演示基础(WPF)在主窗口关闭时隐式调用关闭,即使其他窗口当前打开。

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

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


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

能否在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.
    }
}

我不知道您是如何打开
GetRegistryKey
窗口的,但下面是我的想法。您可以从
App.xaml
文件中设置
StartupUri=“MainWindow.xaml”
,也可以通过编写自己的主方法并调用
应用程序来禁用它。运行(new MainWindow())
。但是,无论哪种情况,您都会打开
main窗口
,并阻止您的注册表窗口


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

是否使用多线程?是否在App.xaml中使用StartupUri,还是使用Application.Run方法?在任何一种情况下,如果使用GetRegistryKey对话框,则应用程序将关闭。这意味着您的GetRegistryKey是应用程序的主对话框,如前所述,它已添加到我的
app.xml
中。但是问题没有解决,程序在
GetRegisterKey
运行后关闭!通过调试器运行它。可能是您使用的那些奇怪的字符串符号。我不能告诉你更多,因为代码本身看起来不错,我试过了。但在弹出窗口的构造函数运行后,程序将关闭!默认名称空间中没有任何
DispatcherUnhandledExceptionEventHandler
DispatcherUnhandledExceptionEventArgs
!你能告诉我名称空间吗?如果你没有更改任何默认配置,那么Zahir是正确的,GetRegistryKey设置为你的主窗口,一旦关闭,它将关闭你的应用程序,因此为了获得更好的答案,提供主窗口xaml和cs文件。@MohsenAfshin我没有更改任何默认配置,但程序将在
GetRegistrKey
打开后关闭。它会自动关闭,我不知道为什么!尝试创建另一个窗口,实例化它并调用ShowDialog,检查它是否再次关闭应用程序。如果是,则问题不在于GetRegisterKey,而在于调用者窗口(MainWindow)。如果没有,那么问题在于GetRegisterKey,因此打开另一个VS实例,创建一个新项目添加副本将GetRegisterKey从解决方案资源管理器粘贴到新项目并检查功能。如果您的主窗口代码不太多,我建议创建另一个项目并在那里复制粘贴主窗口代码,创建一个按钮并在其内部单击窗口ShowGetRegisterKey。看看它是否有效