我一直在使用 DockManager
与 LayoutRoot
, 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 和进入 LayoutDocument 的 UserControl 在关闭窗口时从未被移除,并且会不断地建立更多的 LogicalChildren,直到开始拖慢应用程序。当我检测到 ChildrenCollectionChanged 时,如何删除与该 LayoutDocument 关联的 ContentPresenter 和 UserControl 呢?
编辑1:好吧,LogicalChildren 是 System.Linq.Enumerable.WhereSelectListIterator,所以我无法从该列表中删除任何内容(它只有一个 get,没有 set)。
LayoutDocumentPane.RemoveChild() 方法对 DockingManager.LogicalChildren 不起作用,因此我无法弄清楚 LogicalChildren 从哪里获取迭代数据。
编辑2:所以,我尝试在 DockManager 的 DocumentClosing 事件处理程序中添加了一个事件,但似乎仍然无法从 DockManager 中删除未使用的 LogicalChildren。
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: 在查看了没有任何修改的 DocumentClosed
后,我发现在 LayoutDocumentPane
中仍然存在 User Control,但仍未从 LogicalChildren
中移除。
LayoutAnchorablePane
更改为LayoutDocumentPane
,但我仍然遇到同样的内存问题。 - Bob.