在WPF中从窗口中删除控件

时间:2011-06-28 04:34:53

标签: c# .net wpf window

如何从WPF中的窗口中删除控件? RemoveLogicalChild仅将其作为逻辑子项删除,但仍保持可见状态。

3 个答案:

答案 0 :(得分:24)

可视化树中的每个元素都是树的根,如Window或另一个元素的子元素。理想情况下,您会知道哪个元素是您要删除的元素的父元素,以及它是FrameworkElement的类型。

例如,如果您有一个Canvas和多个孩子,并且您之前添加了Rectangle Canvas,则可以将其从可视树中删除来自Canvas这样:

canvas.Children.Remove(control);

但如果您不知道该控件的父级是谁,您可以使用VisualTreeHelper.GetParent Method找出:

DependencyObject parent = VisualTreeHelper.GetParent(control);

您现在面临的问题是parentDependencyObject,虽然它可能也是FrameworkElement,但您不知道哪种类型的元素它是。这很重要,因为您删除孩子的方式取决于类型。如果父级是Button,那么您只需清除Content属性即可。如果父级是Canvas,则必须使用Children.Remove

一般情况下,您可以通过检查项目是Panel然后从其子项中移除来处理最常见的情况,否则如果它是ContentControl(如Window )然后将其Content属性设置为null。但这不是万无一失的;还有其他情况。

您还必须注意不要删除从模板中展开的内容,因为这不是您可以随意修改的静态内容。如果您添加了控件或存在于静态XAML中,则可以安全地将其删除。

答案 1 :(得分:0)

要检查父类型,您还可以使用GetType方法添加toString方法并进行比较。 例如,当父Object是画布时,将返回字符串“System.Windows.Controls.Canvas”

答案 2 :(得分:0)

您可以使用它来删除子画面,在本例中为画布。

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