2013-10-02 2 views
4

LayoutRoot, LayoutAnchorablePaneLayoutDocumentPane과 함께 DockManager을 사용했습니다.탭을 닫은 후 DockManager에서 LogicalChildren을 제거하는 방법은 무엇입니까?

<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> 

그러나, 나는 encounted 한 하나의 문제는 DockManager.LogicalChildren에서 ContentPresenterUserControl 내가 창을 닫을 때 제거되지 도착 결코 LayoutDocument에 가서 더 LogicalChildren 더가가 시작할 때까지 구축하고 유지하는 것입니다 응용 프로그램을 느리게하십시오.

ChildrenCollectionChanged을 어떻게 감지합니까? LayoutDocument과 연결된 ContentPresenterUserControl을 어떻게 제거합니까?

편집 1 : 좋아, LogicalChildrenSystem.Linq.Enumerable.WhereSelectListIterator<System.WeakReference,object>, 그래서 내가 그 목록에서 아무것도를 제거 할 수 없습니다 (또한 단지 get이 없으며, 더 set).

LayoutDocumentPane.RemoveChild() 메서드는 DockingManager.LogicalChildren에 아무 것도 수행하지 않으므로 LogicalChildren에서 반복 날짜를 가져 오는 위치를 파악할 수 없습니다.

편집 2 : 그래서 DockManagerDocumentClosing 이벤트 처리기에 이벤트를 추가하려고 시도했지만 아직 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 : (대신 DocumentClosing의) 어떤 수정없이 DocumentClosedLayoutDocumentPane에 남아있는 것을보고 후에는 사용자 제어가 LayoutDocumentPane에서 제거 있지만 LogicalChildren에서 여전히 것 같다.

+0

사용중인 avalondock의 버전은 무엇입니까? – Jehof

+0

나는 이것도 전에 가지고 있었다. 내 자신의 해결 방법은 AnchorablePane (Anchorable이있는 다른 것은 무엇이든)을 떼어 내고 'LayoutDocumentPane'을 공장 사이트로 사용하는 것입니다. 나는 당신이했던 것처럼 폐회식을 열었다. –

+0

@Jehof 제가 사용하고 있습니다. v2.0.2000 –

답변

0

표준 마이크로 소프트 컨트롤이 아닌 XceedAvalonDock에 있기 때문에 문제를 제대로 이해하기 어렵습니다. 나는 우리 중 소수만이 세부에서 xceed의 컨트롤을 알고 있다고 생각합니다. 더 이상 xceeds 포럼에이 글을 올리라고 제안합니다.

아직도 문제를 해결하는 데 도움이 될 수있는 모든 wpf control에 적용되는 몇 가지 사항을 말씀드립니다.

때마다 사용 Panel, Pane 또는 무엇이든지 UIElement 당신은 시각 및 논리적 트리로/어린이를 추가/제거 어떤 시점에서 결국 WPF에서하고 설계합니다.

그러므로 나는 당신이 링크를 체크 아웃하는 것이 좋습니다 : 설명합니다

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 나는 당신의 LayoutPanelPanel "마이크로 소프트"에서가 상속 알고 있지만 그나마

그럼 어떻게이 같은 시도에 대해 :

layoutPanel.Children.Remove(..) 

Children은 UIElementCollection이며 모든 UIElementCollection은 RemoveVisualVisual() 및 RemoveLogicalChild() 메서드를 내부에서 호출합니다. 결국

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

나는 두 가지 대체 솔루션을 내놓았다. 위의 방법으로 도움이되지 않는다면 삭제하려는 컨트롤의 부모 인 FrameworkElement을 찾고 FrameworkElement.RemoveLogicalChild을 사용하면 논리 트리에서 자식을 제거 할 수 있습니다.

확인이 링크 아웃 :

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

두 번째 대안 솔루션은하고 설계 패널의 LogicalChildren 속성을 재정의하는 것입니다. 나는 당신이 당신 또는이 우연히 수도 다른 사람에게 어쨌든 도움이 있다면 알려 주시기 바랍니다 http://msdn.microsoft.com/en-us/library/ms742244.aspx

:

이 링크는 방법을 설명합니다. 내가 문제를 이해하지 못했지만 알려 주시면이 게시물을 삭제하겠습니다.

+0

노력해 주셔서 감사합니다. 그러나 그것들 중 어느 것도 옵션이 아니며'FrameworkElement.RemoveLogicalChild'를 사용하고자한다면'internal' 함수이기 때문에 제 자신의 커스텀 클래스를 작성해야합니다. –

+0

wpf에서 자식을 제거하는 데 사용할 수있는 유일한 방법은 음입니다. 그것들 중 하나를 사용할 수 없다는 것은 불가능합니다. 예, 논리 자식 메서드를 제거하면 보호 된 범위에서만 실행될 수 있으므로 논리 자식 속성도 재정의 될 수 있습니다. 당신은 모든 것이 정확하다고 확신합니까? 아이가 논리적 인 나무에 갇혀 있는지 확신합니까? –

+0

스누핑 논리 트리를 사용해 보셨습니까? codeplex.com 또는 이와 비슷한 도구 스눕을 확인하십시오. –

0

저는 메모리 누수 문제라고 생각합니다. 무슨 일이 일어 났는지 기억 프로 파일러를 들여다 보려고 했습니까? 또한이 링크가 귀하의 상황 일 가능성이 있습니까? http://avalondock.codeplex.com/workitem/16060