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

标签 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,它没有 child 的概念。因此,我唯一能看到解决此问题的方法是通过强制转换 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;
   }
}

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

最佳答案

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

您能做的最好的事情是考虑所有基本控件并将它们包含在您身上 if-else梯子。这些是 Panel , Border , ContentControl , ItemsControl

关于wpf - 以通用方式从可视化树中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4396850/

相关文章:

wpf - "Must disconnect specified child from current parent Visual before attaching to new parent Visual"异常如何调试可视化树

wpf - WrapPanel 作为 ItemsControl 的 ItemPanel

c# - 为 ItemsControl 的每一项创建一个 ViewModel

c# - 为什么单击树抛出 'System.Windows.Documents.Run' 不是 Visual 或 Visual3D 的 InvalidOperationException?

c# - 内存流与文件流 : Document Viewer rendering document from filestream successfully but not memorystream?

silverlight - Silverlight 是否使用Presentation Host?

c# - 为什么 VisualTreeHelper.GetChildrenCount() 为 Popup 返回 0?

c# - WPF 图像 - 尝试使用 TreeView ,但无法使背景清晰

wpf - UWP 网格中的内部项目不拉伸(stretch) XAML

c# - 仅当数据更改时才允许用户保存的更好方法?