Удалить элемент управления из окна в WPF

Как удалить элемент управления из окна в WPF? RemoveLogicalChild только удаляет его как логический дочерний элемент, но оставляет его видимым.

Ответы

Ответ 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, его можно безопасно удалить.

Ответ 2

Чтобы проверить тип родителя, вы также можете использовать метод GetType, добавляющий метод toString и сравнение. Например, строка "System.Windows.Controls.Canvas" будет возвращена, когда родительский объект является холстом

Ответ 3

вы можете использовать это, чтобы удалить дочерний элемент из, в данном случае, холста.

private void RemoveControl()
{
   name = myUserControl.GetValue(NameProperty).ToString();               
   myCanvas.Children.Remove(myUserControl);
   NameScope.GetNameScope(this).UnregisterName(name);
}