web-dev-qa-db-ja.com

プログラムでWPFアプリケーションを終了する方法

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

私が試してみました:

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

他にもたくさんあります。何も動作しません。

427
anon271334

あなたのアプリケーションを終了するためにあなたは呼び出すことができます

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

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

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

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

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

695
Dirk Vollmar

もしあなたが 本当に それを閉じるためにそれを必要とするならば、あなたはまた Environment.Exit() を使用することができます、しかしそれはまったく上品ではありません(プロセスを終了させるようなものです)。

次のように使用してください。

Environment.Exit(0)
140
John

wuminqiによる として、Application.Current.Shutdown();は元に戻せないので、ユーザーがログオフしたりWindowsをシャットダウンしたりしたときなどにアプリケーションを強制的に終了させるために使用されると私は考えています。

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

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

57
Allen Pestaluky

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

1.

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

2.

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

上記のすべてのメソッドはclosing eventofWindowclassを呼び出し、実行はどこかの時点で停止することがあります(通常アプリケーションは 'のようなダイアログを表示しますか?' または ' 閉じる前にデータを保存しますか? '、ウィンドウを完全に閉じる前に)

3. しかし、あなたがアプリケーションを終了させたい場合は 何の警告もなしに 直ちに。以下に使用

   Environment.Exit(0);
32
Kylo Ren

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

Application.Current.Shutdown();

あなたが興味を持っているなら、ここに私が参考にした追加の資料があります:

Application.Currentの詳細

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

24
Brian MacKay

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

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

Application.Current.Shutdown();
16
TimothyP

これが私のやり方です。

// 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
B.K.

あなたがこれを行うことができる別の方法:

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

これはあなたのアプリケーションを強制終了します。マルチスレッドアプリケーションでも、常に動作します。

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

6
Ali Yousefie

私の理解によれば、Application.Current.Shutdown()にも欠点があります。

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

6
wuminqi

やってみる

App.Current.Shutdown();

私のために

Application.Current.Shutdown(); 

うまくいきませんでした。

6
Iwona Kubowicz
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);
}
5
Ravi

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

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