9

ユーザーがアプリケーションを閉じる場合は、保存ファイルメッセージを表示する必要があります(編集したファイルの変更を確実に破棄するため)。

これを実装するために、コマンドバインディング(キージェスチャなし)を備えたmenuitemがあります:

private void Command_Exit(object sender, ExecutedRoutedEventArgs e)
{
    Application.Current.Shutdown();
}

メインウィンドウには終了イベントがあります。この場合、未保存のファイルがあるかどうかを確認します。はいの場合、savedialogを開く必要があります(選択するには、どのファイルを保存する必要がありますか)。

private void Window_Closing(object sender, CancelEventArgs e)
    {
        if (sdl.Count() > 0)
        {
            SaveDialog sd = new SaveDialog();
            IEnumerable<Doc> close = sd.ShowDialog(this);
            if (close == null) 
                e.Cancel = true;
            else
                foreach (Doc document in close)
                    document.Save();
        }

    }

このShowDialog-Method(私のSaveDialog-Classに実装されています)で私は呼び出します

bool? ret = ShowDialog();
if (!ret.HasValue)
     return null;
if (!ret.Value)
     return null;

問題は:

Alt + F4-ショートカットを使用してアプリケーションを閉じると(デフォルト-メインウィンドウの動作)、それは機能し、保存されていないファイルがある場合は保存されたダイアログを取得します。しかし、Command_Exit-Methodを実行してアプリケーションを閉じると、Method-Call

bool? ret = ShowDialog(); 

nullを返し、ダイアログは表示されません。

Alt + F4 KeyGestureをCommandBindingに割り当てると、問題が切り替わります。Command_Exitの実行は正常に機能しますが、Alt+F4ショートカットは機能しません。

ShowDialog()-メソッドが両方の場合に機能しない理由とそれを修正する方法は何ですか?

4

2 に答える 2

6

このApplication.Current.Shutdownルートでは、Exitイベントを次のように処理することで、シャットダウン要求をリッスンできます。

http://msdn.microsoft.com/en-us/library/ms597013.aspx

ウィンドウを閉じる方法については詳しく説明されていないため、アプリケーションを閉じる前にcloseingイベントハンドラーが起動することを必ずしも確信しているとは限りません。

アプリケーションをシャットダウンするもう1つの非常に標準的な方法は、メインウィンドウ(最初に表示されているウィンドウ)を閉じることです。これはおそらくWindow.Closeメソッドです。すでにウィンドウのコンテキストにいる場合は、を呼び出すだけClose()です。これにより、終了イベントハンドラーがヒットします。

于 2012-04-12T13:41:29.257 に答える
3

あなたのCommand_Exit実装は間違っています。Application.Current.Shutdown()アプリケーションがすでにシャットダウンしていることを意味します。これにより、ダイアログが開かなくなる可能性があります。

コマンドは別の方法で実装する必要があります。コマンドでは、シャットダウンしても安全かどうかをビジネスロジックに確認しApplication.Current.Shutdown()、その場合にのみ発行する必要があります。それ以外の場合は、ビジネスロジックにシャットダウンシーケンスを開始するように依頼する必要があります。これにより、開いているファイルが保存され、Shutdown保存操作の完了時にが発行されます。

さらに、ユーザーがメインウィンドウを閉じようとしたとき(つまり、メインウィンドウ上Window.Closing)に同じルーチンをトリガーする必要があります。

于 2012-04-12T13:41:27.837 に答える