2010-04-06 3 views
4

Я пытаюсь переместить элемент управления из одного родителя в другой (если это будет работать, я не совсем уверен). Я могу удержать контроль, который я хочу переместить. Вот мой код:WPF FrameworkElement Parent и перемещение UIElement

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

Когда я попал в последние Постулаты ArgumentException брошена с указанием «Указанной Визуальным уже потомок другого Визуальным или корня CompositionTarget.» Странно, что родитель возвращается null. Как найти родителя? Будет ли это работать?

EDIT: Я не думаю, что на самом деле перемещение элемента является ответом на мою проблему. Я работаю с SDK Visual Studio и смог завладеть UIElement, который составляет панель редактора (продолжается DockPanel). Я пытался переместить элемент управления из стандартного редактора в окно настраиваемого инструмента, которое я разрабатываю.

Это оказалось взломом, и я понял, что мне нужно несколько экземпляров одного и того же элемента управления, поэтому я думаю, что более сложное решение (и меньше взлома) находится в запасе.

ответ

6

Свойство Parent относится к логическому дереву, а в документах указано, что «родитель может быть пустым в случаях, когда элемент был создан, но не привязан к логическому дереву, которое в конечном итоге подключается к корневому элементу уровня страницы, или объект приложения ". Например, корневой элемент DataTemplate, созданный в ListBox, имеет нулевой родительский элемент.

Попробуйте использовать вместо этого VisualTreeHelper.GetParent. Визуальное дерево представляет собой представление на более низком уровне того, как организованы элементы WPF, и дает вам доступ ко всем дополнительным «битам», которые могут быть добавлены в шаблоны. Например, вызов VisualTreeHelper.GetParent на корневой элемент DataTemplate, созданный в ListBox, возвращает ContentPresenter.

Обратите внимание, что только потому, что вы можете получить родительский визуал, необязательно означает, что вы сможете его удалить. Некоторые элементы, такие как панели, предоставляют методы для этого. Но если элемент, который вы находите, является частью, скажем, CheckBox, я не думаю, что вы сможете его удалить.

Если вы можете предоставить немного больше контекста для того, чего вы пытаетесь достичь, перемещая элементы управления вокруг визуального дерева, люди могут предложить более конкретные советы или альтернативные подходы.

+0

Обратите внимание на мои изменения для обновленной информации. Я не знал, что VisualTreeHelper существует. Это должно помочь мне идентифицировать родителя. Я не совсем уверен, что перемещение контроля на самом деле является тем, чего мне нужно достичь. –

Смежные вопросы