繁体   English   中英

从 WPF 中的 Window 删除控制

[英]Remove Control from Window in WPF

如何从 WPF 中的 window 中删除控件? RemoveLogicalChild仅将其作为逻辑子级删除,但仍然可见。

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

例如,如果您有一个Canvas和许多孩子,并且您有一个之前添加到CanvasRectangle ,您可以通过从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM