534

ユーザーが[ファイル]メニューから[終了]メニュー項目をクリックしたときなど、どのようにアプリケーションを終了することになっていますか?

私が試してみました:

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

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

4

18 に答える 18

862

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

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

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

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

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

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

于 2010-05-12T15:39:31.997 に答える
182

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

次のように使用します。

Environment.Exit(0)
于 2012-01-29T02:41:52.507 に答える
78

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

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

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

于 2012-01-29T02:31:57.287 に答える
39

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

1.1。

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

2.2。

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

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

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

   Environment.Exit(0);
于 2016-01-22T18:33:21.763 に答える
25

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

Application.Current.Shutdown();

興味があれば、ここに私が役立つと思ったいくつかの追加資料があります:

Application.Currentの詳細

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

于 2010-05-12T15:38:55.897 に答える
19

これが私のやり方です:

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

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

于 2014-02-08T01:20:01.110 に答える
16

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

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

Application.Current.Shutdown();
于 2010-05-12T15:41:50.493 に答える
12

これを行う別の方法:

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

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

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

于 2017-12-04T12:31:39.480 に答える
12

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

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

Process.GetCurrentProcess().Kill();

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

Application.Current.Shutdown();

また

this.Shutdown();

(Appクラスのインスタンスでclledされた場合)

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

this.Close(); 

(Appクラスのインスタンスでclledされた場合)

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

Environment.Exit(0);

また、ここで終了ステータスについて読むことをお勧めします

于 2019-12-18T14:55:16.107 に答える
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);
}
于 2014-02-25T17:01:34.507 に答える
6

試す

App.Current.Shutdown();

私のため

Application.Current.Shutdown(); 

動作しませんでした。

于 2015-03-25T12:56:39.043 に答える
5

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

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

于 2010-05-13T05:24:30.370 に答える
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 });
    }
}
于 2015-08-04T07:55:27.560 に答える
0

アプリケーションオブジェクトを作成しなかった別のスレッドを終了する場合は、次を使用します。System.Windows.Application.Current.Dispatcher.InvokeShutdown()

于 2020-05-13T17:00:00.840 に答える
0

App.Current.Shutdown();
あなたがする必要があるところにそれを書いてください。

于 2022-01-28T22:52:09.637 に答える
-1

を使用Application.Current.Shutdown()してアプリケーションを終了しているSystem.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it.場合、別のスレッドからアプリケーションを呼び出していると、が発生する可能性があります。これを解決するには、次のように呼び出しをラップします

Application.Current.Dispatcher.Invoke(() => Application.Current.Shutdown());
于 2021-10-14T13:45:38.830 に答える
-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

于 2018-10-30T01:45:45.220 に答える
-3

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

Command="SystemCommands.MinimizeWindowCommand"

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

于 2018-06-16T09:42:15.627 に答える