2012-04-12 50 views
8

如果用戶關閉應用程序,則必須顯示保存文件消息(以確保他想放棄編輯文件的更改)。關閉事件中的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方法關閉應用程序,方法調用

bool? ret = ShowDialog(); 

返回null,並且對話框不會出現。

如果我將Alt + F4 KeyGesture分配給CommandBinding,問題就會被切換:執行Command_Exit的效果很好,但不是Alt + F4快捷方式。

ShowDialog() - 方法在兩種情況下都不起作用,以及如何解決它的原因是什麼?

+0

窗戶可以通過哪些方式關閉?不只是交互式。 – Jodrell 2012-04-12 13:38:44

回答

6

Application.Current.Shutdown路線可以讓你聽由處理退出事件關閉請求詳見這裏:

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

它沒有詳細如何關閉窗口,所以我不一定會確信關閉事件處理程序會在關閉應用程序之前觸發。

關閉應用程序的另一個非常標準的方法是關閉主窗口(最初顯示的窗口)。這可能是Window.Close方法,如果您已經在窗口的上下文中,只需撥打Close()即可。這將會發生關閉事件處理程序。

+0

啊,當然,爲什麼我不想簡單地調用Close()?謝謝,問題解決了 – 0xDEADBEEF 2012-04-12 13:47:45

+0

關閉是標準的方式。當主窗體關閉時,代碼自然會進入到退出的入口點。 WPF內部工作將關閉應用程序的任何剩餘部分。 – 2012-04-12 13:48:38

3

您的Command_Exit實施錯誤。 Application.Current.Shutdown()意味着應用程序已關閉,這可能會阻止打開對話框。

您應該以其他方式執行該命令:在該命令中,您應該詢問業務邏輯是否可以安全關閉,並且僅在此情況下才會發出Application.Current.Shutdown()。否則,您應該詢問業務邏輯以啓動關閉順序,這將依次保存打開的文件,並在完成保存操作後發出Shutdown

此外,當用戶嘗試關閉主窗口時(即在其Window.Closing上),應該觸發相同的例程。