【问题标题】:Remove Control from Window in WPF从 WPF 中的窗口中删除控件
【发布时间】:2011-09-24 00:02:07
【问题描述】:

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

【问题讨论】:

  • 如何在窗口中添加控件?你在使用 Grid、StackPanel 还是 Window.Content?
  • 我正在使用 Windows AddChild 函数

标签: c# .net wpf window


【解决方案1】:

您可以使用它从画布中删除一个孩子。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不确定通过这种方法检查父类型会有什么帮助。
    【解决方案3】:

    可视化树中的每个元素要么是树的根,如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 中,则可以安全地删除它。

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 2017-10-18
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      相关资源
      最近更新 更多