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


478

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

私が試してみました:

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

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

回答:


781

アプリケーションを終了するには、次を呼び出すことができます

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

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

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

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

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


8
私が指摘したように、それは奇妙ではありません。WPFでは、アプリケーションは静的クラスです。Application.Currentは、現在実行中のアプリケーションへの参照です。
TimothyP

4
私の意見では、これは一見明白ではないという意味で少し奇妙であり、過去のモデルから逸脱して人々を落とすだけです。もちろんそれが機能することは完全に理にかなっています。
ブライアンマッケイ

20
あなたが電話をかけた場合、機能はApplication.Current.Shutdown();すぐには戻りません。あなたreturn;もこれを呼び出す必要があります。
アーウィンメイヤー

2
私はこれを1つのウィンドウから別のウィンドウをポップアップする場所で使用し、そのウィンドウのwindow_closedイベントでこのコードを追加しました。すべてのウィンドウが消えますが、プログラムはポップアップが作成された後も実行されます。
diyoda_ 2013年

7
@TimothyPいいえApplication、静的クラスではありません。持つApplication.Current静的メンバは、それが静的であることを意味しません。代わりに、派生可能な通常のクラスです。
Earth Engine

156

あなたがいる場合、実際にクローズアウトして、それを必要とします。また、使用することができますEnvironment.Exitを() 、それがすべてでは優雅ではありません(複数のプロセスを終了するなど)。

次のように使用します。

Environment.Exit(0)

4
Environment.Exit()少なくとも1つのパラメータ、終了コードが必要です。Environment.Exit(0)終了コードを気にしない場合に使用します。
gbmhunter 2013年

24
このメソッドは実際にはすべてを閉じました。私のアプリは何かを実行したままにしていました(フォームは閉じていましたが、プロセスはまだ実行されていました)Application.Current.Shutdown();
gbmhunter

4
Environment.Exitは、アプリケーションを確実にシャットダウンするための正しい方法です。Application.Current.Shutdownを使用すると、自分自身をディスパッチャーに戻すコードがある場合、アプリケーションが無期限に実行されてしまう可能性があります。
MarcusAndrén2013

Application.exit(0);と同じです。
Sayka

Application.Current.Shutdown();私のClosingイベントが呼ばれた、ときに私は単純にすぐに私のアプリにシャットダウンしたかったです。したがってEnvironment.Exit(0);、より良い選択でした。
FredM 2018年

64

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

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

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


2
+1実際にアプリケーションを終了する前に開いているファイルを保存する必要があるため、これを使用することにしました。
AgentKnopf 2013年

2
ここで注意すべき重要な点の1つは、アレンが非常に重要な事実を指摘したという事実です。他のすべての所有されているウィンドウがシャットダウンされます。所有権を宣言する必要があります。実行中のウィンドウがあり、別のウィンドウを開いたがまだ表示されていない場合、アクティブウィンドウを閉じると、非表示のウィンドウによってアプリケーションの実行が継続されます。他の手段(タスクマネージャなど)でウィンドウを閉じない限り、メモリリークが発生する可能性があります。私はこれをテストしました。
BK

35

必要に応じて、次のいずれかを使用します。

1。

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

2。

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

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

3.ただし、警告なしですぐにアプリケーションを終了したい場合。以下を使用

   Environment.Exit(0);


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()意図しない設計上の欠陥から私を守ります。

それは私の個人的な経験からです。最後に、シナリオに最適なものを使用します。これは単なる別の情報です。


16

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

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

Application.Current.Shutdown();

8

これを行う別の方法:

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

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

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


これは理解しづらいようです。「進行中は常に機能します」。直せますか?または、少なくともここであなたが何を意味するのかコメントで説明しますか?
Peter Mortensen、

これも一部理解不能です。別のスレッドからファイルにデータを保存するアプリケーションに注意してください。直せますか?または、少なくともここであなたが何を意味するのかコメントで説明しますか?
Peter Mortensen、

あなたはグーグル翻訳を使っているのですか?
Peter Mortensen、

いいえ、そうではありません。つまり、アプリケーションがマルチスレッドとして実行されていて、Process.Killを使用している場合です。それは機能しますが、別の方法では、別のスレッドが実行されているときにマルチスレッドアプリケーションで機能しません。
Ali Yousefi、

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);
}

これは彼がwpfアプリケーションを終了する方法を知りたいだけの質問の答えではありません。
mehdi


6

私の理解によると、Application.Current.Shutdown()また、その欠点があります。

確認ウィンドウを表示して、ユーザーが終了するかどうかを確認できるようにする場合、元Application.Current.Shutdown()に戻すことはできません。


7
分かりません。Application.Current.Shutdown()ただし、電話をかける前にユーザー確認を取得できます。
Amsakanna 2010年

2
なぜ確認する必要があるのか​​わかりません。確認が多すぎることは非常に悪いことです。誰かがクリックして[ファイル]メニューを開き、[ファイル]メニューの一番下まで移動して[終了]をクリックするという手間をかけたという事実は、アプリケーションを使用したくないことを確認しています。

Veer:私の場合、確認ウィンドウは表示されますが、確認で[キャンセル]を選択しても、メインAPPは終了します。
wuminqi

7
JTS:これはケースバイケースで設計する方が良いです。私たちのアプリは、実行中のジョブがある場合、強制終了により損害が発生するため、確認ダイアログで通知することをお
勧めします

3

要約すると、それを行うにはいくつかの方法があります。

1)プロセスの終了、ファイナライズ、エラー処理などをスキップします。

Process.GetCurrentProcess().Kill();

2)現在のアプリケーションをシャットダウンします。これは、出口イベントを呼び出すため、おそらく適切な方法です。

Application.Current.Shutdown();

または

this.Shutdown();

(Appクラスのインスタンスに含まれる場合)

3)現在のアプリを閉じる(すべてのフォームを早く閉じる/終了する必要があります):

this.Close(); 

(Appクラスのインスタンスに含まれる場合)

4)アプリを終了する環境を終了します。

Environment.Exit(0);

また、終了ステータスについてはこちらをご覧ください


2

カリバーンマイクロフレーバー

public class CloseAppResult : CancelResult
{
    public override void Execute(CoroutineExecutionContext context)
    {
        Application.Current.Shutdown();
        base.Execute(context);
    }
}

public class CancelResult : Result
{
    public override void Execute(CoroutineExecutionContext context)
    {
        OnCompleted(this, new ResultCompletionEventArgs { WasCancelled = true });
    }
}

何ん「カリバーンマイクロ風味」意味ですか?
Peter Mortensen、

カリバーンマイクロを使用してそれをどのように達成するか
アンデルス

0

アプリケーションオブジェクトを作成しなかった別のスレッドを終了する場合は、以下を使用します。

System.Windows.Application.Current.Dispatcher.InvokeShutdown();

-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;


2
SO、Alpha-LIonへようこそ!コードのみの回答は、問題がどのように解決されたかについての洞察を提供しないため、ここでは推奨されません。コードがOPの問題をどのように解決するかを説明して、ソリューションを更新してください:)
Joel

-3

XAMLコードから、事前定義されたSystemCommandを呼び出すことができます。

Command="SystemCommands.MinimizeWindowCommand"

これが望ましい方法だと思います...


最小化!=アプリケーションを終了します。そのリストにアプリの終了オプションがありません。より多くのウィンドウ管理とウィンドウを閉じることは必ずしもアプリを閉じることを意味するわけではありません。 msdn.microsoft.com/en-us/library/...
ケニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.