4

私は、とを使用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: わかりましたので、そのリストから何も削除することLogicalChildrenSystem.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

4

3 に答える 3

0

Xceedあなたは世界にいて、AvalonDock標準のMicrosoftコントロールではないので、あなたの問題を正しく理解するのは難しいです. ここで xceed のコントロールを詳細に知っている人はほとんどいないと思います。さらに、これを xceeds フォーラムに投稿することをお勧めします。

wpf controlそれでも、問題の解決に役立つ可能性のあるすべてに当てはまるいくつかのことをお伝えしたいと思います.

を使用するときはいつでもPanelPaneまたはUIElementWPF でレイアウトするために何かを使用すると、ある時点でビジュアルおよび論理ツリーに/から子を追加/削除することになります。

したがって、次のリンクを確認することをお勧めします。

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(..)

Children は UIElementCollection であり、すべての UIElementCollection は、Remove() 内部で RemoveVisualVisual() および RemoveLogicalChild() メソッドを内部的に呼び出します。

http://msdn.microsoft.com/en-us/library/system.windows.controls.uielementcollection.aspx

最終的に、2 つの代替ソリューションを思いつきました。上記のことが役に立たない場合FrameworkElementは、削除したいコントロールの親を見つけてFrameworkElement.RemoveLogicalChild、論理ツリーから子を削除します。

このリンクをチェックしてください:

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.removelogicalchild.aspx

2 番目の代替ソリューションはLogicalChildren、レイアウト パネルのプロパティをオーバーライドすることです。

このリンクでは、次の方法について説明しています: http://msdn.microsoft.com/en-us/library/ms742244.aspx

これがあなたやこれに出くわす可能性のある他の人にとって何らかの形で役に立ったかどうかをお知らせください. あなたの問題をまったく理解できなかった場合は、お知らせください。この投稿を削除します。

于 2013-10-19T09:54:35.233 に答える