我一直在使用DockManager和。LayoutRootLayoutAnchorablePaneLayoutDocumentPane
<ad:DockingManager x:Name="dockManager" >
<adLayout:LayoutRoot>
<adLayout:LayoutPanel x:Name="myLayoutPanel" Orientation="Horizontal">
<adLayout:LayoutAnchorablePane x:Name="myLayoutAnchorablePane" DockWidth="400"/>
<adLayout:LayoutDocumentPane x:Name="myDocumentPane" ChildrenCollectionChanged="myDocumentPane_ChildrenCollectionChanged"/>
</adLayout:LayoutPanel>
</adLayout:LayoutRoot>
</ad:DockingManager>
Run Code Online (Sandbox Code Playgroud)
然而,我遇到的一个问题是DockManager.LogicalChildren,当我关闭窗口时,进入 的ContentPresenter和 my永远不会被删除,并且会越来越多,直到它开始减慢应用程序的速度。UserControlLayoutDocumentLogicalChildren
当我检测到 时ChildrenCollectionChanged,如何删除与之关联的ContentPresenter和?UserControlLayoutDocument
编辑1:好的,也是LogicalChildren,System.Linq.Enumerable.WhereSelectListIterator<System.WeakReference,object>所以我无法从该列表中删除任何内容(而且它只有一个get,并且没有set)。
该LayoutDocumentPane.RemoveChild()方法不会对 执行任何操作DockingManager.LogicalChildren,因此我无法弄清楚 是LogicalChildren从哪里提取迭代日期的。
编辑2:所以,我尝试向DocumentClosing事件处理程序添加一个事件DockManager,但它似乎仍然没有LogicalChildren从 DockManager 中删除未使用的事件。
void dockManager_DocumentClosing(object sender, Xceed.Wpf.AvalonDock.DocumentClosingEventArgs e) {
UserControl uc = e.Document.Content as UserControl;
e.Cancel = true;
e.Document.IsActive = false;
if(uc != null) {
var u = myDocumentPane.Children.Where(a => a.Content.Equals(uc)).FirstOrDefault();
u.IsActive = false;
u.Close();
myDocumentPane.Children.Remove(u);
myDocumentPane.RemoveChild(u);
var oldLogicalParentPaneControl =
LogicalTreeHelper.GetParent(u.Content as UIElement) as Xceed.Wpf.AvalonDock.DockingManager;
oldLogicalParentPaneControl.Layout.RemoveChild(u);
oldLogicalParentPaneControl.Layout.CollectGarbage();
dockManager.UpdateLayout();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑3:在查看 没有任何修改(而不是)LayoutDocumentPane之后保留的内容后,似乎用户控件已从 中删除,但没有从still 中删除。DocumentClosedDocumentClosingLayoutDocumentPaneLogicalChildren
Xceed由于您身处AvalonDock世界而不是标准的微软控件,因此很难正确理解您的问题。我想我们这里只有少数人详细了解 xceed 的控件。此外,我建议您将其发布到 xceeds 论坛上。
尽管如此,我还是想向您提及一些适用于所有wpf control可能帮助您解决问题的事情。
每当您使用Panel,Pane或其他任何方式UIElement在 WPF 中进行布局时,您最终都会在视觉和逻辑树中添加或删除子级。
因此我建议您查看以下链接:
http://msdn.microsoft.com/en-us/library/ms753391.aspx
这将详细解释 wpf 树。
另请查看以下链接Panel.Children:
http://msdn.microsoft.com/en-us/library/system.windows.controls.panel.internalchildren.aspx
我不知道你的LayoutPanel那里是否继承自“Microsoft” Panel,但如果是的话,那么你尝试这样的事情怎么样:
layoutPanel.Children.Remove(..)
Run Code Online (Sandbox Code Playgroud)
Children 是一个UIElementCollection,每个UIElementCollection 在内部调用Remove()、RemoveVisualVisual() 和RemoveLogicalChild() 方法。
http://msdn.microsoft.com/en-us/library/system.windows.controls.uielementcollection.aspx
最后我想出了两个替代解决方案。如果上面的内容对您没有任何帮助,您只需找到FrameworkElement您希望删除的控件的父级,然后使用FrameworkElement.RemoveLogicalChild您从逻辑树中删除子级即可。
查看此链接:
http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.removeologicalchild.aspx
第二种替代解决方案是覆盖LogicalChildren布局面板的属性。
此链接向您解释如何: http ://msdn.microsoft.com/en-us/library/ms742244.aspx
我希望您让我知道这对您或其他可能偶然发现这一点的人是否有帮助。如果我根本不理解你的问题,请告诉我,我将删除这篇文章。