私は、とを使用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
ただし、私が遭遇した 1 つの問題は、ContentPresenter
ウィンドウを閉じても削除されず、アプリケーションの速度が低下し始めるまでますます増加し続けることです。UserControl
LayoutDocument
LogicalChildren
を検出したときに、それに関連付けられていたとをChildrenCollectionChanged
削除するにはどうすればよいですか?ContentPresenter
UserControl
LayoutDocument
編集 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
の後に残っているものを見た後、ユーザー コントロールは から削除されたようですが、まだ削除されていないようです。DocumentClosed
DocumentClosing
LayoutDocumentPane
LogicalChildren