C# 发送';关闭';通过我自己的命令来命令窗口?

C# 发送';关闭';通过我自己的命令来命令窗口?,c#,wpf,C#,Wpf,我正在使用MVVM设计原则构建一个wpf应用程序。My ViewModels有一个close命令,它触发一个RequestClose事件。如果将ViewModel设置为窗口的datacontext,则该窗口将订阅此事件,并在触发事件时对自身调用Close() 我的问题是,用户可以在不通过我的RequestClose系统的情况下关闭窗口-例如,单击窗口右上角的“x”。我希望覆盖此选项,以便单击“x”向我的CloseCommand发送请求 我尝试将此方法附加到窗口上的“关闭”事件: void Clo

我正在使用MVVM设计原则构建一个wpf应用程序。My ViewModels有一个
close命令
,它触发一个
RequestClose
事件。如果将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

如何在Windows XAML中设置
Window.WindowStyle=“None”
(隐藏顶部按钮和chrome),然后添加您自己的“假”chrome和按钮,您可以根据需要连接这些按钮

如何在VM中的某个地方设置bool
IsClosing
,自己跟踪它?那行吗?@我没想到——我可能会同意。不过这有点像黑客,我宁愿吃点别的。我明白。。我看到还有一个
OnClosing
事件。你可能想从那里触发bool。我曾想过做类似的事情,但我认为要制作与操作系统的感觉很好融合的“假”按钮真的很难。我会说这很容易,但我想这取决于你对WPF的了解:)