以通用的方式从可视化树中移除一个元素

13

我想从可视树中移除一个 FrameworkElement。由于 FrameworkElement 具有 Parent 属性,因此通过从该属性中删除它来解决这个问题是显而易见的:

FrameworkElement childElement;
if(childElement != null && childElement.Parent != null) // In the visual tree
{
   // This line will, of course not complie:
   // childElement.Parent.RemoveFromChildren(childElement);
}

问题在于FrameworkElement的Parent属性是DependencyObject类型,它没有子元素的概念。所以我能想到的唯一解决方法是通过将Parent强制转换为Border、Panel等(有子元素概念的元素)来查看并从那里移除:

FrameworkElement childElement;
if(childElement != null && childElement.Parent != null) // In the visual tree
{
   if(childElement.Parent is Panel)
   {
     (childElement.Parent as Panel).Children.Remove(childElement );
   }
   if(childElement.Parent is Border)
   {
     (childElement.Parent as Border).Child = null;
   }
}
显然这不是一个很灵活的解决方案,也不是通用的。有人能建议一种更通用的方法来从可视树中移除一个元素吗?
1个回答

7
我认为没有更简单的方法。实际上,不能有一种易于通用的方法来完成这个任务。WPF非常灵活,您可以创建一个自定义控件,并使用模板将3个子项显示在3个不同的位置上,还可以使用自定义模板。
您可以做的最好的事情是考虑所有基本控件,并将它们包含在您的if-else语句中。这些控件包括PanelBorderContentControlItemsControl等。

很遗憾,没有适用于具有子项的项目的通用接口。感谢列表,我没有想到ContentControl或ItemsControl...暂时这样就可以了! - Gergely Orosz
3
@Gergely: 我看到了一篇关于 WPF 内容模型的 MSDN 文章,认为这可能对你有用。链接如下:http://msdn.microsoft.com/library/bb613548.aspx - decyclone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接