プログラムでWPFアプリケーションを終了するにはどうすればよいですか?

2010年05月12日に質問されました。  ·  閲覧回数 368.1k回  ·  ソース

anon271334 picture
2010年05月12日

私はC#(Windowsフォーム)を使用して数年になりますが、WPFを使用したことはありません。 しかし、今はWPFが大好きですが、ユーザーが[ファイル]メニューの[終了]メニュー項目をクリックしたときに、アプリケーションを終了する方法がわかりません。

私が試してみました:

this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();

他の多くの中で。 何も機能しません。

回答

Dirk Vollmar picture
2010年05月12日
811

アプリケーションを終了するには、

System.Windows.Application.Current.Shutdown();

Application.Shutdownメソッドのドキュメントで説明されているように、 ShutdownModeを指定して、アプリケーションのシャットダウン動作を変更することもできます。

シャットダウンは、次の状況でWindows Presentation Foundation(WPF)によって暗黙的に呼び出されます。

  • ShutdownModeがOnLastWindowCloseに設定されている場合。
  • ShutdownModeがOnMainWindowCloseに設定されている場合。
  • ユーザーがセッションを終了し、SessionEndingイベントが未処理であるか、キャンセルなしで処理された場合。

Application.Current.Shutdown();は、 Applicationオブジェクトを作成したスレッド、つまり通常はメインスレッドからのみ呼び出すことができることにも注意してください。

John picture
2012年01月29日
167

本当に終了する必要がある場合は、 Environment.Exit()を使用することもできますが、それはまったく優雅ではありません(プロセスを終了するようなものです)。

次のように使用します。

Environment.Exit(0)
Allen Pestaluky picture
2012年01月29日
71

wuminqiが言ったようにApplication.Current.Shutdown();元に戻せません。通常、ユーザーがログオフしたりWindowsをシャットダウンしたりするときなど、アプリケーションを強制的に閉じるために使用されると思います。

代わりに、メインウィンドウでthis.close()を呼び出します。 これは、 Alt + F4またはウィンドウの[x]を閉じるボタンを押すのと同じです。 これにより、所有されている他のすべてのウィンドウが閉じられ、閉じるアクションがキャンセルされない限り、 Application.Current.Shutdown();呼び出されます。 ウィンドウ

また、 this.close()はキャンセル可能であるため、終了イベントハンドラーの変更の保存確認ダイアログに入れることができます。 <Window Closing="...">イベントハンドラーを作成し、それに応じてe.Cancelを変更するだけです。 (これを行う方法の詳細については、 MSDNのドキュメントを参照してください。)

Kylo Ren picture
2016年01月23日
36

必要に応じて、次のいずれかを使用してください。

1.1。

 App.Current.Shutdown();
OR
 Application.Current.Shutdown();

2.2。

 App.Current.MainWindow.Close();
OR
 Application.Current.MainWindow.Close();

とりわけ、メソッドはWindowクラスのclosing eventを呼び出し、実行はある時点で停止する可能性があります(通常、アプリケーションは「よろしいですか?」または「閉じる前にデータを保存しますか?」などのダイアログを表示します。 '、ウィンドウが完全に閉じられる前)

3.ただし、警告なしにアプリケーション

   Environment.Exit(0);
Brian MacKay picture
2010年05月12日
25

これでうまくいくはずです:

Application.Current.Shutdown();

興味のある方は、次の資料が役に立ちました。

Application.Currentの詳細

WPFアプリケーションのライフサイクル

B.K. picture
2014年02月08日
18

これが私のやり方です:

// Any control that causes the Window.Closing even to trigger.
private void MenuItemExit_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}

// Method to handle the Window.Closing event.
private void Window_Closing(object sender, CancelEventArgs e)
{
    var response = MessageBox.Show("Do you really want to exit?", "Exiting...",
                                   MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
    if (response == MessageBoxResult.No)
    {
        e.Cancel = true;
    }
    else
    {
        Application.Current.Shutdown();
    }
}

メインアプリケーションウィンドウからApplication.Current.ShutDown()を呼び出すだけで、他のすべてのウィンドウはthis.Close()ます。 私のメインウィンドウでは、 Window_Closing(...)が右上のxボタンを処理します。 いずれかのメソッドがウィンドウクローザーを要求する場合、ユーザーが確認すると、 Window_Closing(...)はシャットダウンのためにイベントを取得します。

私が実際にメインウィンドウでApplication.Current.Shutdown()を使用する理由は、設計ミスが発生し、アプリケーションでウィンドウの1つの親を宣言していない場合、そのウィンドウに気付いたためです。最後のアクティブなウィンドウを閉じる前に表示されずに開かれると、非表示のウィンドウがバックグラウンドで実行されたままになります。 アプリケーションはシャットダウンしません。 完全なメモリリークを防ぐ唯一の方法は、タスクマネージャーにアクセスしてアプリケーションをシャットダウンすることです。 Application.Current.Shutdown()は、意図しない設計上の欠陥から私を保護します。

それは私の個人的な経験によるものです。 最後に、シナリオに最適なものを使用してください。 これは単なる別の情報です。

TimothyP picture
2010年05月12日
16

Application.ShutDown();または.Exit()メッセージがあってはなりません。

Applicationは静的クラスです。 現在のアプリケーションを参照していません。 現在のアプリケーションにアクセスして、次のようにシャットダウンする必要があります。

Application.Current.Shutdown();
Ali Yousefi picture
2017年12月04日
10

これを行う別の方法:

System.Diagnostics.Process.GetCurrentProcess().Kill();

これにより、アプリケーションが強制的に強制終了されます。 マルチスレッドアプリケーションでも常に機能します。

注:別のスレッドで保存されていないデータを失わないように注意してください。

Ravi picture
2014年02月26日
6
private void _MenuExit_Click(object sender, RoutedEventArgs e)
{
   System.Windows.Application.Current.MainWindow.Close();
}

//Override the onClose method in the Application Main window

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    MessageBoxResult result =   MessageBox.Show("Do you really want to close", "",
                                          MessageBoxButton.OKCancel);
    if (result == MessageBoxResult.Cancel)
    {
       e.Cancel = true;
    }
    base.OnClosing(e);
}
Iwona Kubowicz picture
2015年03月25日
6

試してみてください

App.Current.Shutdown();

私のために

Application.Current.Shutdown(); 

動作しませんでした。