在WPF中移除窗口控件

22

我该如何从WPF窗口中移除控件? RemoveLogicalChild只能移除它作为逻辑子元素的身份,但无法使其在界面上不可见。


你是如何在窗口中添加控件的?你使用Grid、StackPanel还是Window.Content? - Kishore Kumar
我正在使用Windows的AddChild函数。 - Casebash
3个回答

33

视觉树中的每个元素要么是树的根节点,比如一个Window,要么是另一个元素的子元素。理想情况下,您应该知道您要删除的元素的父元素以及它是何种类型的FrameworkElement

例如,如果您有一个Canvas和许多子元素,并且之前添加了一个RectangleCanvas中,您可以通过从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 添加的或已存在,则可以安全地将其删除。

0

你可以使用这个方法从画布中移除一个子元素。

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

0

要检查父类型,您还可以使用GetType方法添加toString方法并进行比较。

例如,当父对象是Canvas时,将返回字符串"System.Windows.Controls.Canvas"。


我不确定通过这种方法检查父类型会有什么帮助。 - Mike Two

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接