it-swarm.com.ru

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

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

17
Casebash

Каждый элемент в визуальном дереве является либо корнем дерева, например Window, либо дочерним элементом другого элемента. В идеале вы должны знать, какой элемент является родительским для элемента, который вы пытаетесь удалить, и какой это тип FrameworkElement.

Например, если у вас есть Canvas и много дочерних элементов, и у вас есть Rectangle, который ранее был добавлен в Canvas, вы можете удалить его из визуального дерева, удалив его из Canvas, например так:

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

23
Rick Sladkey

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

0
Emile Nouatin

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

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