Удаление элемента из визуального дерева общим способом - PullRequest
13 голосов
/ 09 декабря 2010

Я хотел бы удалить FrameworkElement из визуального дерева. Поскольку 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, который не имеет представления о дочерних элементах. Таким образом, единственное, что я могу увидеть, решая эту проблему, - приведение Родителя, чтобы увидеть, является ли это Границей, Панелью и т. Д. (Элементами, имеющими представление о дочерних элементах), и удалить его оттуда:

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 Ответ

7 голосов
/ 09 декабря 2010

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

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

...