我想从可视化树中删除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;
}
}
显然,这不是一个非常灵活的解决方案,根本不是通用的。有人可以建议一种更通用的方法从视觉树中删除元素吗?
答案 0 :(得分:7)
我认为没有更简单的方法。实际上,没有一种简单的通用方法可以做到这一点。 WPF
非常灵活,您可以使用模板创建自定义控件,该模板可以使用自定义模板在3个不同的位置显示3个孩子。
您最擅长的是考虑所有基本控件并将其包含在if-else
阶梯中。这些是Panel
,Border
,ContentControl
,ItemsControl
等。