我该如何从WPF窗口中移除控件? RemoveLogicalChild
只能移除它作为逻辑子元素的身份,但无法使其在界面上不可见。
视觉树中的每个元素要么是树的根节点,比如一个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
。但这并不是万无一失的;还有其他情况。你可以使用这个方法从画布中移除一个子元素。
private void RemoveControl()
{
name = myUserControl.GetValue(NameProperty).ToString();
myCanvas.Children.Remove(myUserControl);
NameScope.GetNameScope(this).UnregisterName(name);
}
要检查父类型,您还可以使用GetType方法添加toString方法并进行比较。
例如,当父对象是Canvas时,将返回字符串"System.Windows.Controls.Canvas"。
AddChild
函数。 - Casebash