Родитель WPF FrameworkElement и перемещение UIElement

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

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

То, когда я поразил последний statment, ArgumentException брошен, заявив "Указанный Визуальный, уже является ребенком другого Визуального или корень CompositionTarget". Странная вещь состоит в том, что Parent возвращает пустой указатель. Как действительно определяют местоположение родителя? Это будет даже работать?

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

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

6
задан Dave Clemmer 22 August 2013 в 02:59
поделиться

1 ответ

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

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

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

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

7
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: