私は、とを使用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>
DockManager.LogicalChildrenただし、私が遭遇した 1 つの問題は、ContentPresenterウィンドウを閉じても削除されず、アプリケーションの速度が低下し始めるまでますます増加し続けることです。UserControlLayoutDocumentLogicalChildren
を検出したときに、それに関連付けられていたとをChildrenCollectionChanged削除するにはどうすればよいですか?ContentPresenterUserControlLayoutDocument
編集 1: わかりましたので、そのリストから何も削除することLogicalChildrenはSystem.Linq.Enumerable.WhereSelectListIterator<System.WeakReference,object>できません (また、 のみでget、 はありませんset)。
LayoutDocumentPane.RemoveChild()メソッドは に対して何もしないので、 が反復日付をDockingManager.LogicalChildrenどこから取得しているのかわかりません。LogicalChildren
DocumentClosing編集2:そのため、イベントハンドラーにイベントを追加しようとしましたが、まだDockManager から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: (の代わりに) 変更なしでLayoutDocumentPaneの後に残っているものを見た後、ユーザー コントロールは から削除されたようですが、まだ削除されていないようです。DocumentClosedDocumentClosingLayoutDocumentPaneLogicalChildren