Подтвердить что ты не робот

Удаление элемента из визуального дерева общим способом

Я хотел бы удалить элемент 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;
   }
}

Очевидно, что это не очень гибкое решение, а не общее. Может ли кто-нибудь предложить более общий подход к удалению элемента из визуального дерева?

4b9b3361

Ответ 1

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

Что вы можете сделать лучше всего, это принять во внимание все основные элементы управления и включить их в вашу лестницу if-else. Это Panel, Border, ContentControl, ItemsControl и т.д.