我正在使用MVVM设计原则构建一个wpf应用程序。我的ViewModel有CloseCommand
触发RequestClose
事件。如果将ViewModel设置为窗口的datacontext,则窗口将订阅此事件,并在触发事件时自行调用Close()
。
我的问题是,用户可以在不通过我的RequestClose
系统的情况下关闭窗口 - 例如,通过单击窗口右上角的“x”。我希望覆盖它,以便点击“x”向我的CloseCommand
发送请求。
我尝试将此方法附加到我窗口的'Closing'事件中:
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 :(得分:1)
如何在Windows XAML中设置Window.WindowStyle = "None"
(隐藏顶部按钮和镶边),然后添加您自己的'假'铬和按钮,您可以随意连接