通过我自己的命令发送窗口的“关闭”命令?

时间:2012-04-25 10:26:06

标签: c# wpf

我正在使用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

1 个答案:

答案 0 :(得分:1)

如何在Windows XAML中设置Window.WindowStyle = "None"(隐藏顶部按钮和镶边),然后添加您自己的'假'铬和按钮,您可以随意连接