2012-04-12 13 views
8

ユーザーがアプリケーションを閉じると、Save-File-Messageを表示する必要があります(編集したファイルの変更を破棄したいことを確認する必要があります)。閉鎖イベントのShowDialog

これを実装するために、私は、コマンドバインディング(キージェスチャーなし)でメニューアイテムを持っている:

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を-方法で(私のSaveDialogはクラスで実装)私は

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

を呼び出します問題は次のとおりです:

私はAlt + F4ショートカットを使用してアプリケーション(メインウィンドウのデフォルト動作)を使用すると動作し、保存されていないファイルがある場合はsavedialogを取得します。私はCommand_Exit-メソッドを実行することにより、アプリケーションを閉じる場合は、nullを

bool? ret = ShowDialog(); 

リターンをメソッドは、呼び出し、ダイアログは表示されません。

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

ShowDialog() - メソッドが両方のケースで動作しない理由と、それを修正する方法は何ですか?

+0

どのようにしてウィンドウを閉じることができますか?インタラクティブにだけでなく、 – Jodrell

答えて

6

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

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

それはそれはウィンドウを閉じ方法について詳しくないので、私は必ずしもではないでしょう終了イベントハンドラがアプリケーションを閉じる前に起動することを確信しました。

アプリケーションをシャットダウンする他の非常に標準的な方法は、メインウィンドウ(最初に表示されているウィンドウ)を閉じることです。これはWindow.Closeメソッドである可能性があります。ウィンドウのコンテキストに既に入っている場合は、Close()を呼び出します。これは終了イベントハンドラにヒットします。

+0

ああ、もちろん、なぜ私は単純にClose()を呼び出すことを考えなかったのですか?ありがとう、問題解決 – 0xDEADBEEF

+0

閉じるは標準的な方法です。メインフォームが閉じると、コードは自然に終了するエントリポイントに進みます。 WPFの内部動作は、アプリケーションの残りの部分をシャットダウンします。 –

3

Command_Exit実装が間違っています。 Application.Current.Shutdown()は、アプリケーションが既にシャットダウンしているため、ダイアログが開くのを防ぐことができます。

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

また、ユーザーがメインウィンドウを閉じるとき(つまり、そのWindow.Closing)に同じルーチンを起動する必要があります。