[英]Remove Control from Window in WPF
如何从 WPF 中的 window 中删除控件? RemoveLogicalChild
仅将其作为逻辑子级删除,但仍然可见。
可视化树中的每个元素要么是树的根,如Window
,要么是另一个元素的子元素。 理想情况下,您会知道哪个元素是您要删除的元素的父元素以及它是什么类型的FrameworkElement
。
例如,如果您有一个Canvas
和许多孩子,并且您有一个之前添加到Canvas
的Rectangle
,您可以通过从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
。 但这并非万无一失。 还有其他情况。
您还必须注意不要删除从模板扩展的内容,因为这不是您可以随意修改的 static 内容。 如果您添加了控件或存在于 static XAML 中,则可以安全地删除它。
要检查父类型,您还可以使用 GetType 方法添加 toString 方法并进行比较。 例如,当父 Object 是 canvas 时,将返回字符串“System.Windows.Controls.Canvas”
您可以使用它从 canvas 中移除一个孩子。
private void RemoveControl()
{
name = myUserControl.GetValue(NameProperty).ToString();
myCanvas.Children.Remove(myUserControl);
NameScope.GetNameScope(this).UnregisterName(name);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.