【发布时间】:2011-09-24 00:02:07
【问题描述】:
如何从 WPF 的窗口中删除控件? RemoveLogicalChild 仅将其作为逻辑子级删除,但仍保持可见。
【问题讨论】:
-
如何在窗口中添加控件?你在使用 Grid、StackPanel 还是 Window.Content?
-
我正在使用 Windows
AddChild函数
如何从 WPF 的窗口中删除控件? RemoveLogicalChild 仅将其作为逻辑子级删除,但仍保持可见。
【问题讨论】:
AddChild 函数
您可以使用它从画布中删除一个孩子。
private void RemoveControl()
{
name = myUserControl.GetValue(NameProperty).ToString();
myCanvas.Children.Remove(myUserControl);
NameScope.GetNameScope(this).UnregisterName(name);
}
【讨论】:
要检查父类型,也可以使用GetType 方法添加toString 方法并进行比较。 例如,当父对象为画布时,将返回字符串“System.Windows.Controls.Canvas”
【讨论】:
可视化树中的每个元素要么是树的根,如Window,要么是另一个元素的子元素。理想情况下,您会知道哪个元素是您要删除的元素的父元素,以及它是什么类型的 FrameworkElement。
例如,如果您有一个 Canvas 和许多孩子,并且您有一个以前添加到 Canvas 的 Rectangle,您可以通过将其从 Canvas 中删除来将其从可视树中删除,例如这个:
canvas.Children.Remove(control);
但如果你不知道控件的父级是谁,你可以使用VisualTreeHelper.GetParent Method找出:
DependencyObject parent = VisualTreeHelper.GetParent(control);
您现在面临的问题是parent 是DependencyObject,虽然它可能也是FrameworkElement,但您不知道它是哪种 元素。这很重要,因为您如何移除孩子取决于类型。如果父级是Button,那么您只需清除Content 属性。如果父级是Canvas,则必须使用Children.Remove。
一般来说,您可以通过检查项目是否为Panel 然后从其子项中删除来处理最常见的情况,否则如果它是ContentControl(如Window)则设置其@987654340 @属性到null。但这并非万无一失。还有其他情况。
您还必须注意不要删除从模板扩展的内容,因为这不是您可以随意修改的静态内容。如果您添加了控件或存在于静态 XAML 中,则可以安全地删除它。
【讨论】: