C#(Windowsフォーム)を使用して数年、私はWPFを使用したことがありません。しかし、今はWPFが大好きですが、ユーザーが[ファイル]メニューの[終了]メニュー項目をクリックしたときにアプリケーションを終了する方法がわかりません。
私が試してみました:
this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();
他の多くの間で。何も機能しません。
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
オブジェクトを作成したスレッド、つまり通常はメインスレッドからのみ呼び出すことができることにも注意してください。
Application.Current.Shutdown();
すぐには戻りません。あなたreturn;
もこれを呼び出す必要があります。
Application
、静的クラスではありません。持つApplication.Current
静的メンバは、それが静的であることを意味しません。代わりに、派生可能な通常のクラスです。
あなたがいる場合、実際にクローズアウトして、それを必要とします。また、使用することができますEnvironment.Exitを() 、それがすべてでは優雅ではありません(複数のプロセスを終了するなど)。
次のように使用します。
Environment.Exit(0)
Environment.Exit()
少なくとも1つのパラメータ、終了コードが必要です。Environment.Exit(0)
終了コードを気にしない場合に使用します。
Application.Current.Shutdown();
Application.Current.Shutdown();
私のClosing
イベントが呼ばれた、ときに私は単純にすぐに私のアプリにシャットダウンしたかったです。したがってEnvironment.Exit(0);
、より良い選択でした。
wuminqiが言ったように、これは元に戻すApplication.Current.Shutdown();
ことができず、ユーザーがログオフしたりWindowsをシャットダウンしたりするときなどに、アプリケーションを強制的に閉じるために通常使用されると思います。
代わりに、this.close()
メインウィンドウで呼び出します。これは、ウィンドウのAlt+ F4または閉じる[x]ボタンを押すのと同じです。これにより、他のすべての所有されているウィンドウが閉じApplication.Current.Shutdown();
られ、閉じるアクションがキャンセルされない限り、呼び出しが終了します。ウィンドウを閉じるに関するMSDNドキュメントを参照してください。
また、this.close()
はキャンセル可能であるため、closedイベントハンドラーに変更の保存確認ダイアログを配置できます。単にイベントハンドラを作成し、それに応じて<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
、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()
意図しない設計上の欠陥から私を守ります。
それは私の個人的な経験からです。最後に、シナリオに最適なものを使用します。これは単なる別の情報です。
これを行う別の方法:
System.Diagnostics.Process.GetCurrentProcess().Kill();
これにより、アプリケーションが強制終了されます。マルチスレッドアプリケーションでも常に機能します。
注:別のスレッドで保存されていないデータを失わないように注意してください。
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);
}
私の理解によると、Application.Current.Shutdown()
また、その欠点があります。
確認ウィンドウを表示して、ユーザーが終了するかどうかを確認できるようにする場合、元Application.Current.Shutdown()
に戻すことはできません。
Application.Current.Shutdown()
ただし、電話をかける前にユーザー確認を取得できます。
要約すると、それを行うにはいくつかの方法があります。
1)プロセスの終了、ファイナライズ、エラー処理などをスキップします。
Process.GetCurrentProcess().Kill();
2)現在のアプリケーションをシャットダウンします。これは、出口イベントを呼び出すため、おそらく適切な方法です。
Application.Current.Shutdown();
または
this.Shutdown();
(Appクラスのインスタンスに含まれる場合)
3)現在のアプリを閉じる(すべてのフォームを早く閉じる/終了する必要があります):
this.Close();
(Appクラスのインスタンスに含まれる場合)
4)アプリを終了する環境を終了します。
Environment.Exit(0);
カリバーンマイクロフレーバー
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 });
}
}
XAMLコードから、事前定義されたSystemCommandを呼び出すことができます。
Command="SystemCommands.MinimizeWindowCommand"
これが望ましい方法だと思います...