ユーザーが[ファイル]メニューから[終了]メニュー項目をクリックしたときなど、どのようにアプリケーションを終了することになっていますか?
私が試してみました:
this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();
他の多くの中で。何も機能しません。
アプリケーションを終了するには、
System.Windows.Application.Current.Shutdown();
メソッドのドキュメントで説明されているように、 ShutdownModeApplication.Shutdown
を指定して、アプリケーションのシャットダウン動作を変更することもできます。
シャットダウンは、次の状況でWindows Presentation Foundation(WPF)によって暗黙的に呼び出されます。
- ShutdownModeがOnLastWindowCloseに設定されている場合。
- ShutdownModeがOnMainWindowCloseに設定されている場合。
- ユーザーがセッションを終了し、SessionEndingイベントが未処理であるか、キャンセルなしで処理された場合。
また、オブジェクトを作成したスレッド、つまり通常はメインスレッドApplication.Current.Shutdown();
からのみ呼び出すことができることにも注意してください。Application
本当に終了する必要がある場合は、 Environment.Exit()を使用することもできますが、それはまったく優雅ではありません(プロセスを終了するようなものです)。
次のように使用します。
Environment.Exit(0)
wuminqiが言ったように、Application.Current.Shutdown();
は元に戻せません。通常、ユーザーがWindowsをログオフしたりシャットダウンしたりするときなど、アプリケーションを強制的に閉じるために使用されると思います。
代わりに、this.close()
メインウィンドウで呼び出します。Altこれは、ウィンドウの+F4または閉じる[x]ボタンを押すのと同じです。Application.Current.Shutdown();
これにより、所有している他のすべてのウィンドウが閉じ、閉じるアクションがキャンセルされない限り、呼び出しが発生します。ウィンドウを閉じるに関するMSDNドキュメントを参照してください。
また、this.close()
キャンセル可能であるため、終了イベントハンドラーに変更の保存確認ダイアログを表示できます。のイベントハンドラーを作成し、それに応じ<Window Closing="...">
て変更するだけe.Cancel
です。(これを行う方法の詳細については、MSDNのドキュメントを参照してください。)
必要に応じて、次のいずれかを使用してください。
1.1。
App.Current.Shutdown();
OR
Application.Current.Shutdown();
2.2。
App.Current.MainWindow.Close();
OR
Application.Current.MainWindow.Close();
とりわけ、メソッドはクラスの呼び出しclosing event
をWindow
行い、実行はある時点で停止する可能性があります(通常、アプリケーションは、ウィンドウが完全に閉じられる前に、「よろしいですか?」または「閉じる前にデータを保存しますか?」などのダイアログを表示します)
3.ただし、警告なしにアプリケーションをすぐに終了したい場合。以下を使用してください
Environment.Exit(0);
これでうまくいくはずです:
Application.Current.Shutdown();
興味があれば、ここに私が役立つと思ったいくつかの追加資料があります:
これが私のやり方です:
// 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()
意図しない設計上の欠陥から私を保護します。
それは私の個人的な経験によるものです。最後に、シナリオに最適なものを使用してください。これは単なる別の情報です。
Application.ShutDown();
または.Exit()
メッセージがあってはなりません。
Application
静的クラスです。現在のアプリケーションを参照していません。現在のアプリケーションにアクセスして、次のようにシャットダウンする必要があります。
Application.Current.Shutdown();
これを行う別の方法:
System.Diagnostics.Process.GetCurrentProcess().Kill();
これにより、アプリケーションが強制的に強制終了されます。マルチスレッドアプリケーションでも常に機能します。
注:別のスレッドで保存されていないデータを失わないように注意してください。
要約すると、それを行うにはいくつかの方法があります。
1)ファイナライズ、エラー処理などをスキップするプロセスを強制終了します。
Process.GetCurrentProcess().Kill();
2)現在のアプリケーションをシャットダウンします。これは、終了イベントを呼び出すため、おそらく適切な方法です。
Application.Current.Shutdown();
また
this.Shutdown();
(Appクラスのインスタンスでclledされた場合)
3)現在のアプリを閉じる(すべてのフォームを早く閉じる/終了する必要があります):
this.Close();
(Appクラスのインスタンスでclledされた場合)
4)環境を終了すると、アプリが終了します。
Environment.Exit(0);
また、ここで終了ステータスについて読むことをお勧めします
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);
}
試す
App.Current.Shutdown();
私のため
Application.Current.Shutdown();
動作しませんでした。
私の理解によると、Application.Current.Shutdown()
欠点もあります。
ユーザーが終了するかどうかを確認できる確認ウィンドウを表示する場合は、元に戻すことはできませんApplication.Current.Shutdown()
。
カリバーンマイクロフレーバー
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 });
}
}
アプリケーションオブジェクトを作成しなかった別のスレッドを終了する場合は、次を使用します。System.Windows.Application.Current.Dispatcher.InvokeShutdown()
App.Current.Shutdown();
あなたがする必要があるところにそれを書いてください。
を使用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());
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
xamlコードから、事前定義されたSystemCommandを呼び出すことができます。
Command="SystemCommands.MinimizeWindowCommand"
これが好ましい方法だと思います...