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

Ger*_*osz 13 silverlight wpf 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);
}
Run Code Online (Sandbox Code Playgroud)

问题是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;
   }
}
Run Code Online (Sandbox Code Playgroud)

显然,这不是一个非常灵活的解决方案,根本不是通用的.有人可以建议一种更通用的方法从视觉树中删除元素吗?

dec*_*one 7

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

你可以做的最好的是考虑所有的基本控制,并将它们包含在你的if-else阶梯中.这是Panel,Border,ContentControl,ItemsControl,等.

  • @Gergely:我在MSDN上发现了一篇关于WPF内容模型的文章.我虽然这可能对你有用.http://msdn.microsoft.com/library/bb613548.aspx (3认同)