WPF中的树(逻辑树和视觉树)
WPF 中主要的树结构是元素树。如果使用 XAML 创建应用程序页,则将基于标记中元素的嵌套关系创建树结构。如果使用代码创建应用程序,则将基于为属性(实现给定元素的内容模型)指定属性值的方式创建树结构。在 Windows Presentation Foundation (WPF) 中,处理和使用概念说明元素树的方法实际上有两种:即逻辑树和可视化树。
逻辑树用途
逻辑树的存在用途是使内容模型可以容易地循环访问其可能包含的子元素,从而可以对内容模型进行扩展。此外,逻辑树还为某些通知提供了框架,例如当加载逻辑树中的所有元素时。
可视化树
WPF 中除了逻辑树的概念,还存在可视化树的概念。可视化树描述由Visual基类表示的可视化对象的结构。为控件编写模板时,将定义或重新定义适用于该控件的可视化树。对于出于性能和优化原因想要对绘图进行较低级别控制的开发人员来说,他们也会对可视化树感兴趣。作为常规 WPF 应用程序编程一部分的可视化树的一个公开情况是,路由事件的事件路由大多数情况下遍历可视化树,而不是逻辑树。这种微妙的路由事件行为可能不会很明显,除非您是控件作者。在可视化树中路由使得在可视化级别实现组合的控件能够处理事件或创建事件 setter。
树、内容元素和内容宿主
内容元素(从ContentElement派生的类)不是可视化树的一部分;内容元素不从Visual继承并且没有可视化表示形式。若要完全在 UI 中显示,则必须在既是Visual,也是逻辑树元素(通常是FrameWorkElement)的内容宿主中承载ContentElement。您可以使用概念说明,内容宿主有点类似于内容的“浏览器”,它选择要在该宿主控制的屏幕区域中显示内容的方式。承载内容时,可以使内容成为通常与可视化树关联的某些树进程的参与者。通常,FrameWorkElement宿主类包括实现代码,该代码用于通过内容逻辑树的子节点将任何已承载的ContentElement添加到事件路由,即使承载内容不是真实可视化树的一部分时也将如此。这样做是必要的,以便ContentElement可以为路由到除其自身之外的任何元素的路由事件提供来源。
msdn: http://msdn.microsoft.com/zh-cn/library/ms753391.aspx