WPF FrameworkElement Родитель и перемещение элемента UIElement - PullRequest
6 голосов
/ 06 апреля 2010

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

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

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

РЕДАКТИРОВАТЬ: Я не думаю, что на самом деле перемещение элемента является ответом на мою проблему. Я работаю с Visual Studio SDK и смог взять UIElement, который составляет панель редактора (расширяет DockPanel). Я пытался переместить элемент управления из стандартного редактора в настраиваемое окно инструментов, которое я разрабатываю.

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

1 Ответ

7 голосов
/ 06 апреля 2010

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

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

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

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

...