2

最初に、何をしようとしているのかを説明したいと思います。学生にカード​​を見せるための学習アプリケーションを開発しています。CardPackカードのグループであるクラスがあります。

カード パックのライセンスを取得するために、ユーザーから ID を取得したいので、ユーザーから RegisterKey を取得するためのウィンドウを作成しました。これは私のGetRegisterKey("CardPackName")方法です:

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

しかし、grk.ShowDialog();実行後にプログラムが終了し、その理由がわかりません! 誰でもこの問題を解決するのを手伝ってもらえますか?!?


アップデート

GetRegisterKeyWindows_loadedイベントでの新しいインスタンスを作成しようとしましたが、MainWindows呼び出しましたがgrk.ShowDialog()、正常に機能し、プログラムは閉じませんでした。問題の原因がわからない!

しかし、問題はそれからではないことがわかり、そのGetRegisterKeyコードを質問から削除します。

Update2

実行されるかどうかを確認するためにブレークポイントを配置しました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"から設定することも、独自のMainメソッドを記述してを呼び出すことで無効にすることもできます。ただし、どちらの場合も、レジストリウィンドウを開いて防止することになります。App.xamlapplication.Run(new MainWindow())MainWindow

だから、クラスGetRegistryKeyの前にどういうわけかウィンドウを作成したと思います。MainWindowそして、私が知る限り、アプリケーションは最初に作成されたウィンドウをメインウィンドウとして主張します。したがって、Application.Current.MainWindow閉じる前に設定する必要があります。

于 2012-10-08T17:02:14.913 に答える