2012-04-25 98 views
0

我正在使用MVVM設計原則構建一個wpf應用程序。我的ViewModel有一個觸發RequestClose事件的CloseCommand。如果將ViewModel設置爲窗口的datacontext,則窗口將訂閱此事件,並在事件觸發時自行呼叫Close()通過我自己的命令發送窗口的「關閉」命令?

我的問題是,用戶可以不通過我的RequestClose系統而導致窗口關閉 - 例如,通過單擊窗口右上角的「x」。我想覆蓋這個,所以點擊'x'發送一個請求到我的CloseCommand

我試圖這種方法附連到「截止」事件我的窗口:

void CloseWindow(object sender, CancelEventArgs e) 
{ 
    var chwn = sender as ChildWindow; 
    var dc = chwn.DataContext as AbstractWorkspaceViewModel; 
    if (openWindows.Any((wn => dc == wn.DataContext))) { 
     if (dc.CloseCommand.CanExecute(null)) { 
      dc.CloseCommand.Execute(null); 
      e.Cancel = true; 
     } 
    } 
} 

然而,從CloseCommand鏈(通過RequestClose後)結束調用window.Close(),這會導致以下錯誤:

"Cannot set Visibility to Visible or call Show, ShowDialog, 
Close, or WindowInteropHelper.EnsureHandle while a Window is closing." 

我想這是因爲即使我寫了e.Cancel = true,窗口仍然認爲它關閉,直到稍後。

我想改變我的方法是這樣的:

 if (dc.CloseCommand.CanExecute(null)) 
      dc.CloseCommand.Execute(null); 
     else 
      e.Cancel = true; 

,然後只調用window.close()如果窗口尚未關閉,但我不能工作,如何找出一個窗口已經關閉。

我該如何解決這個問題?是否可以將窗口上的'x'綁定到我的CloseCommand

+0

如何設置一個布爾'IsClosing 「你的虛擬機中的某個地方,只是自己跟蹤它?這會起作用嗎? – Default 2012-04-25 10:51:51

+0

@Default我沒有想到 - 我可能會用它。儘管它有一點點黑客,但我寧願有其他的東西。 – Oliver 2012-04-25 11:02:59

+0

我明白..我發現還有一個「OnClosing」事件。你可能想從那裏觸發bool。 – Default 2012-04-25 11:03:50

回答

1

如何在您設置Window.WindowStyle = "None"的Windows XAML(可隱藏頂部的按鈕和鍍鉻),然後加上自己的「假」鉻按鈕,你就可以將起來,只要你喜歡

+0

我曾經想過做這樣的事情,但我認爲製作'假'按鈕非常適合操作系統的感覺。 – Oliver 2012-04-25 11:47:10

+0

我會說這很容易,但我想這取決於你對WPF的知識:) – 2012-04-25 11:49:44