C# WPF-AvalonDock-结案文件
我在WPF项目中使用AvalonDock和MVVM 当我点击“X”(选项卡的“关闭”按钮)时,我的文档将关闭,但仍保留在内存中。它似乎只是隐藏起来的。它不会从我的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> /
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>