在WPF中从窗口中删除控件

Cas*_*ash 18 .net c# wpf window

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

Ric*_*key 24

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

例如,如果您有一个Canvas和多个孩子,并且您Rectangle之前添加了一个孩子,则Canvas可以通过将其从以下内容中移除来将其从可视树中删除Canvas:

canvas.Children.Remove(control);
Run Code Online (Sandbox Code Playgroud)

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

DependencyObject parent = VisualTreeHelper.GetParent(control);
Run Code Online (Sandbox Code Playgroud)

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

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

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