ここ数年、私はC#(Windowsフォーム)を使ってきましたが、私はWPFを使ったことがありません。しかし、今はWPFが大好きですが、ユーザーが[ファイル]メニューの[終了]メニュー項目をクリックしたときにアプリケーションを終了する方法がわからない場合があります。
私が試してみました:
this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();
他にもたくさんあります。何も動作しません。
あなたのアプリケーションを終了するためにあなたは呼び出すことができます
System.Windows.Application.Current.Shutdown();
Application.Shutdown
メソッドのドキュメントで説明されているように、 ShutdownMode を指定することでアプリケーションのシャットダウン動作を変更することもできます。
以下の状況では、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]ボタンを閉じる。これにより、他の所有されているウィンドウはすべて閉じられ、closeアクションがキャンセルされない限り、Application.Current.Shutdown();
を呼び出します。 MSDNドキュメントの ウィンドウを閉じる を参照してください。
また、this.close()
はキャンセル可能であるため、クロージングイベントハンドラに変更を保存する確認ダイアログを表示することができます。 <Window Closing="...">
のイベントハンドラを作成し、それに応じてe.Cancel
を変更するだけです。 (これを行う方法の詳細については、 MSDNのドキュメント を参照してください。)
必要に応じて次のいずれかを使用してください。
1.
App.Current.Shutdown();
OR
Application.Current.Shutdown();
2.
App.Current.MainWindow.Close();
OR
Application.Current.MainWindow.Close();
上記のすべてのメソッドはclosing event
ofWindow
classを呼び出し、実行はどこかの時点で停止することがあります(通常アプリケーションは 'のようなダイアログを表示しますか?' または ' 閉じる前にデータを保存しますか? '、ウィンドウを完全に閉じる前に)
3. しかし、あなたがアプリケーションを終了させたい場合は 何の警告もなしに 直ちに。以下に使用
Environment.Exit(0);
これでうまくいくはずです。
Application.Current.Shutdown();
あなたが興味を持っているなら、ここに私が参考にした追加の資料があります:
Application.ShutDown();
または.Exit()
メッセージはありません。
Application
は静的クラスです。現在のアプリケーションを参照していません。現在のアプリケーションにアクセスしてから、次のようにシャットダウンする必要があります。
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()
は意図しない設計上の欠陥から私を守ります。
それは私の個人的な経験からです。最後に、シナリオに最適なものを使用してください。これは単なる別の情報です。
あなたがこれを行うことができる別の方法:
System.Diagnostics.Process.GetCurrentProcess().Kill();
これはあなたのアプリケーションを強制終了します。マルチスレッドアプリケーションでも、常に動作します。
注意:別のスレッドで保存されていないデータを失わないように注意してください。
私の理解によれば、Application.Current.Shutdown()
にも欠点があります。
ユーザーが終了時に確認するかどうかを確認する確認ウィンドウを表示したい場合、Application.Current.Shutdown()
は元に戻せません。
やってみる
App.Current.Shutdown();
私のために
Application.Current.Shutdown();
うまくいきませんでした。
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);
}
カリバーンマイクロフレーバー
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 });
}
}