C# WPF-AvalonDock-结案文件

C# WPF-AvalonDock-结案文件,c#,wpf,mvvm,dispose,docking,C#,Wpf,Mvvm,Dispose,Docking,我在WPF项目中使用AvalonDock和MVVM 当我点击“X”(选项卡的“关闭”按钮)时,我的文档将关闭,但仍保留在内存中。它似乎只是隐藏起来的。它不会从我的Model.Documents集合中删除 如果我添加DockingManager\u DocumentClosing并尝试从集合中删除我的文档,我会在以下Xceed.Wpf.AvalonDock.Layout.LayoutContent方法中收到异常,因为parentAsContainer为空 /// <summary> /

我在WPF项目中使用AvalonDock和MVVM

当我点击“X”(选项卡的“关闭”按钮)时,我的文档将关闭,但仍保留在内存中。它似乎只是隐藏起来的。它不会从我的
Model.Documents
集合中删除

如果我添加
DockingManager\u DocumentClosing
并尝试从集合中删除我的文档,我会在以下
Xceed.Wpf.AvalonDock.Layout.LayoutContent方法中收到异常,因为
parentAsContainer
为空

/// <summary>
/// Close the content
/// </summary>
/// <remarks>Please note that usually the anchorable is only hidden (not closed). By default when user click the X button it only hides the content.</remarks>
public void Close()
{
    var root = Root;
    var parentAsContainer = Parent as ILayoutContainer;
    parentAsContainer.RemoveChild(this);
    if (root != null)
        root.CollectGarbage();
    OnClosed();
}

事实上,我发现了一个无法接受的解决办法。 这真是扭曲

我只是作为参考。应该有一个干净的方法来做这件事

    // ************************************************************************
    private void DockingManager_DocumentClosing(object sender, Xceed.Wpf.AvalonDock.DocumentClosingEventArgs e)
    {
        e.Document.CanClose = false;

        DocumentModel documentModel = e.Document.Content as DocumentModel;
        if (documentModel != null)
        {
            Dispatcher.BeginInvoke(new Action(() => this.Model.DocumentItems.Remove(documentModel)), DispatcherPriority.Background);
        }
    }

注册IsVisibleChanged

void layoutFPR_Hidden(object sender, EventArgs e)
{
    LayoutAnchorable window = (LayoutAnchorable)sender;
    YourClass content = window.Content as YourClass;

    // Close the object
    content = null;
    ((LayoutAnchorable)sender).Close();

}

我发现在
布局文档
布局选项卡窗格
上,应用这两种设置都有效:
CanClose=“False”
CanFloat=“False”

它会删除关闭按钮

<avalonDock:LayoutDocument Title="Board"
                           ContentId="Board"
                           CanClose="False"
                           CanFloat="False">
</avalonDock:LayoutDocument>


如果您不使用MVVM,是否有办法解决此问题?这是一个很长的机会,但我从未调用过此事件,其他人是否有类似的经验?@Mårten,我不再使用AvalonDock。我使用Actipro Docking。@EricOuellet我应该在哪里写入/重写此方法?@Daniel,DockingManager上应该有一个名为“DocumentClosing”的事件发生在文档关闭之前。这已经有三年多了。。。也许界面已经改变了?我们实际上使用的是ActiPro对接,但您必须为此付费。
<avalonDock:LayoutDocument Title="Board"
                           ContentId="Board"
                           CanClose="False"
                           CanFloat="False">
</avalonDock:LayoutDocument>