以通用方式从可视树中删除项目

时间:2010-12-09 09:52:39

标签: wpf silverlight visual-tree

我想从可视化树中删除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,它没有子节点的概念。因此,我唯一可以看到的问题是通过强制转换父级来查看它是否是边框,面板等(具有子级概念的元素)并从中删除它:

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 个答案:

答案 0 :(得分:7)

我认为没有更简单的方法。实际上,没有一种简单的通用方法可以做到这一点。 WPF非常灵活,您可以使用模板创建自定义控件,该模板可以使用自定义模板在3个不同的位置显示3个孩子。

您最擅长的是考虑所有基本控件并将其包含在if-else阶梯中。这些是PanelBorderContentControlItemsControl等。