我一直在使用DockManager
withLayoutRoot
和.LayoutAnchorablePane
LayoutDocumentPane
<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>
但是,我遇到的一个问题是,当我关闭窗口时,进入的DockManager.LogicalChildren
那个ContentPresenter
和我的永远不会被删除,并且越来越多,直到它开始减慢应用程序的速度。UserControl
LayoutDocument
LogicalChildren
当我检测到时ChildrenCollectionChanged
,我如何删除ContentPresenter
与UserControl
那相关的和LayoutDocument
?
编辑 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();
}
}
编辑 3:在查看 未进行任何修改(而不是)之后剩余的内容LayoutDocumentPane
后,似乎用户控件已从 中删除,但仍没有从其中删除。DocumentClosed
DocumentClosing
LayoutDocumentPane
LogicalChildren