2010-04-06 2 views
4

한 부모에서 다른 부모로 컨트롤을 이동하려고합니다 (잘 모르겠다면). 나는 움직이고 싶은 컨트롤을 잡을 수 있습니다. 여기 내 코드입니다. "시각 지정 이미 다른 시각 또는 CompositionTarget의 루트의 자식"WPF FrameworkElement 부모 및 UI 요소 이동

public void MoveElement(UIElement uiElement) 
{ 
    var element = ((FrameworkElement)uiElement).Parent; 
    //TODO:Remove from parent 
    myControl.Children.Add(uiElement); 
} 

내가 ArgumentException이 진술 발생합니다 마지막 한 Statment 충돌 이상한 점은 Parent가 null을 반환한다는 것입니다. 부모 위치는 어떻게 찾습니까? 이것도 작동합니까?

편집 : 실제로 요소를 이동하는 것이 내 문제의 해답이라고 생각하지 않습니다. Visual Studio SDK를 사용하여 편집기 창 (DockPanel)을 구성하는 UIElement을 보유 할 수있었습니다. 컨트롤을 표준 편집기에서 개발중인 사용자 지정 도구 창으로 옮기려고했습니다.

이것은 해킹 인 것으로 입증되었으며 동일한 컨트롤의 인스턴스가 여러 개 필요하다는 것을 알았습니다. 따라서 더 복잡한 솔루션 (그리고 해킹이 적음)이 저장되어 있다고 생각합니다.

답변

6

속성은 논리 트리를 참조하며 문서는 "요소가 인스턴스화되었지만 결국 페이지 수준 루트 요소에 연결되는 논리적 트리에 연결되지 않은 경우 부모가 null 일 수 있습니다. 응용 프로그램 개체. " 예를 들어 ListBox에 인스턴스화 된 DataTemplate의 루트 요소에는 null Parent가 있습니다.

대신 VisualTreeHelper.GetParent을 사용해보세요. 시각적 트리는 WPF 요소가 구성되는 방식을 나타내는 하위 수준의 표현이며 여기에 템플릿이 던져 넣는 것과 같은 모든 추가 "비트"에 대한 액세스를 제공합니다. 예를 들어 DataTemplate의 루트 요소에 VisualTreeHelper.GetParent을 호출하면 ListBox에 인스턴스화되어 ContentPresenter이 반환됩니다.

부모님의 시각 자료를 보유하고 있다고해서 반드시 부모님이 제거 할 수 있다는 의미는 아닙니다. 패널과 같은 일부 요소는이를위한 메소드를 제공합니다. 하지만 찾은 요소가 CheckBox의 일부라면 제거 할 수 없을 것이라고 생각합니다.

컨트롤을 시각적 트리 주변으로 이동하여 달성하려는 목표에 대해 좀 더 많은 컨텍스트를 제공 할 수있는 경우 사람들은보다 구체적인 조언이나 대체 접근법을 제공 할 수 있습니다.

+0

업데이트 된 정보를 수정했습니다. 나는 VisualTreeHelper가 존재한다는 것을 몰랐다. 그게 내가 부모를 확인하는 데 도움이 될거야. 컨트롤을 옮기는 것이 실제로 달성해야하는 것은 아닌지 잘 모르겠습니다. –