Ответ 1
Каждый элемент в визуальном дереве является либо корнем дерева, как Window
, либо дочерним элементом другого элемента. В идеале вы должны знать, какой элемент является родителем элемента, который вы пытаетесь удалить, и типа FrameworkElement
.
Например, если у вас есть Canvas
и много детей, и у вас есть Rectangle
, который был ранее добавлен в Canvas
, вы можете удалить его из визуального дерева, удалив его из Canvas
like это:
canvas.Children.Remove(control);
Но если вы не знаете, кто является родителем элемента управления, вы можете использовать метод VisualTreeHelper.GetParent, чтобы узнать
DependencyObject parent = VisualTreeHelper.GetParent(control);
Проблема, с которой вы теперь сталкиваетесь, - это parent
- это DependencyObject
, и хотя она, вероятно, также является FrameworkElement
, вы не знаете , какой ее элемент. Это важно, потому что, как вы удаляете дочерний элемент, это зависит от типа. Если родительский элемент является Button
, вы просто очищаете свойство Content
. Если родительский элемент Canvas
, вам нужно использовать Children.Remove
.
В общем случае вы можете обрабатывать наиболее распространенные случаи, проверяя, является ли элемент Panel
, а затем удаляется из его дочерних элементов, иначе, если это ContentControl
(например, Window
), установите его Content
свойство null
. Но это не безупречно; есть и другие случаи.
Вы также должны быть осторожны, чтобы не удалить что-то, которое было расширено из шаблона, потому что это не статический контент, который вы можете изменить по своему усмотрению. Если вы добавили элемент управления или существовали в статическом XAML, его можно безопасно удалить.