Удаление элемента из визуального дерева общим способом
Я хотел бы удалить элемент FrameworkE визуального дерева. Поскольку FrameworkElement имеет свойство Parent, было бы очевидно решить эту проблему, удалив его оттуда:
FrameworkElement childElement;
if(childElement != null && childElement.Parent != null) // In the visual tree
{
// This line will, of course not complie:
// childElement.Parent.RemoveFromChildren(childElement);
}
Проблема заключается в том, что свойство Parent FrameworkElement имеет DependencyObject, который не имеет понятия о дочерних элементах. Так что единственное, что я вижу в этой проблеме, - это лить родителя, чтобы увидеть, есть ли он Border, Panel и т.д. (Элементы, которые имеют представление о дочерних элементах) и удалить его оттуда:
FrameworkElement childElement;
if(childElement != null && childElement.Parent != null) // In the visual tree
{
if(childElement.Parent is Panel)
{
(childElement.Parent as Panel).Children.Remove(childElement );
}
if(childElement.Parent is Border)
{
(childElement.Parent as Border).Child = null;
}
}
Очевидно, что это не очень гибкое решение, а не общее. Может ли кто-нибудь предложить более общий подход к удалению элемента из визуального дерева?
Ответы
Ответ 1
Я не думаю, что есть более простой способ. На самом деле не может быть простого общего способа сделать это. WPF
очень гибкий, и вы можете создать настраиваемый элемент управления с шаблоном, который отображает 3 дочерних элемента для отображения в трех разных местах с помощью настраиваемых шаблонов.
Что вы можете сделать лучше всего, это принять во внимание все основные элементы управления и включить их в вашу лестницу if-else
. Это Panel
, Border
, ContentControl
, ItemsControl
и т.д.