2012-04-25 69 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