C# 从WPF中的窗口中删除控件

C# 从WPF中的窗口中删除控件,c#,.net,wpf,window,C#,.net,Wpf,Window,如何在WPF中从窗口删除控件RemoveLogicalChild仅将其作为逻辑子级删除,但仍使其可见。可视化树中的每个元素要么是树的根(如窗口),要么是另一个元素的子级。理想情况下,您应该知道哪个元素是要删除的元素的父元素,以及它是什么类型的FrameworkElement 例如,如果您有一个画布和许多子项,并且您有一个先前添加到画布的矩形,您可以通过将其从画布中移除,将其从可视树中移除,如下所示: canvas.Children.Remove(control); 但如果您不知道控件的父控件是

如何在WPF中从窗口删除控件
RemoveLogicalChild
仅将其作为逻辑子级删除,但仍使其可见。

可视化树中的每个元素要么是树的根(如
窗口),要么是另一个元素的子级。理想情况下,您应该知道哪个元素是要删除的元素的父元素,以及它是什么类型的
FrameworkElement

例如,如果您有一个
画布
和许多子项,并且您有一个先前添加到
画布
矩形
,您可以通过将其从
画布
中移除,将其从可视树中移除,如下所示:

canvas.Children.Remove(control);
但如果您不知道控件的父控件是谁,则可以使用查找:

DependencyObject parent = VisualTreeHelper.GetParent(control);
您现在面临的问题是
parent
是一个
DependencyObject
,虽然它可能也是一个
FrameworkElement
,但您不知道它是哪种元素。这一点很重要,因为删除子对象的方式取决于类型。如果父项是
按钮
,则只需清除
内容
属性。如果父对象是
画布
,则必须使用
子对象。删除

通常,您可以通过检查项目是否为
面板
,然后从其子项中删除来处理最常见的情况,否则,如果它是
内容控件
(如
窗口
),则将其
内容
属性设置为
。但这并不是万无一失的;还有其他情况


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

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

在本例中,您可以使用该字符串从画布中删除子对象

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

如何在窗口中添加控件?您使用的是网格、堆栈面板还是Window.Content?我使用的是Windows
AddChild
功能我不确定通过此方法检查父类型会有什么帮助。