这部分的内容来自于即将出版的新书《WPF Unleashed》的第三章样章。关于什么是逻辑树,我们先看下面的一个伪XAML代码的例子:
<Window ......>
<StackPanel>
<Label>LabelText</Lable>
</StackPanel>
</Window>
在这样一个简单UI中,Window是一个根结点,它有一个子结点StackPanel。而StackPanel有一个子结点Label。注意Label下还有一个子结点string(LabelText),它同时也是一个叶子结点。这就构成了窗口的一个逻辑树。逻辑树始终存在于WPF的UI中,不管UI是用XAML编写还是用代码编写。WPF的每个方面(属性、事件、资源等等)都是依赖于逻辑树的。
视觉树基本上是逻辑树的一种扩展。逻辑树的每个结点都被分解为它们的核心视觉组件。逻辑树的结点对我们而言基本是一个黑盒。而视觉树不同,它暴露了视觉的实现细节。下面是Visual Tree结构就表示了上面四行XAML代码的视觉树结构:
并不是所有的逻辑树结点都可以扩展为视觉树结点。只有从System.Windows.Media.Visual和System.Windows.Media.Visual3D继承的元素才能被视觉树包含。其他的元素不能包含是因为它们本身没有自己的提交(Rendering)行为。
在Windows Vista SDK Tools当中的XamlPad提供查看Visual Tree的功能。需要注意的是XamlPad目前只能查看以Page为根元素,并且去掉了SizeToContent属性的XAML文档。如下图所示:
注意图中工具栏特别标记的地方。我们可以看到Visual Tree确实比较复杂,其中还包含有很多的不可见元素,比如ContentPresenter。Visual Tree虽然复杂,但是在一般情况下,我们不需要过多地关注它。我们在从根本上改变控件的风格、外观时,需要注意Visual Tree的使用,因为在这种情况下我们通常会改变控件的视觉逻辑。
WPF中还提供了遍历逻辑树和视觉树的辅助类:System.Windows.LogicalTreeHelper和System.Windows.Media.VisualTreeHelper。注意遍历的位置,逻辑树可以在类的构造函数中遍历。但是,视觉树必须在经过至少一次的布局后才能形成。所以它不能在构造函数遍历。通常是在OnContentRendered进行,这个函数为在布局发生后被调用。
其实每个Tree结点元素本身也包含了遍历的方法。比如,Visual类包含了三个保护成员方法VisualParent、VisualChildrenCount、GetVisualChild。通过它们可以访问Visual的父元素和子元素。而对于FrameworkElement,它通常定义了一个公共的Parent属性表示其逻辑父元素。特定的FrameworkElement子类用不同的方式暴露了它的逻辑子元素。比如部分子元素是Children Collection,有是有时Content属性,Content属性强制元素只能有一个逻辑子元素。
分享到:
相关推荐
WPF元素树及其细微之处的详细检查
WPF TreeGrid树形表格
学习WPF目录树很好的例子,对初学都很有帮助
wpf datagrid实现树结构
WPF多选树控件,在树的基础上,加上多选,并给出获取选中集合的demo,也可以进行其他的转化,满足日常中的使用
由于项目需要一个树形下拉菜单,在网上找了半天,找到一个sliverlight的,结果转成wpf又出错,放弃了,无赖只好自己整一个WPF的,思路是CheckBox+Popup完成了需求,基础实现,各位可以根据需求扩展成自己的想要的...
网上的一个silverlight的树形下拉控件,改成wpf使用的了,希望对各位有所帮助。
wpf实现DataGrid列表控件实现树形结构,并且展开控件ToggleButton可以放在任意一列,也可以冻住多列不可拖动。
WPF 自定义 树形选择框,Combox+TreeView 实现,支持多选,自定义样式
将多选树作为模版放置到用户控件中使用,这样可以避免多选树重复的定义Node和一些不必要的代码重复写。
WPF列表树控件,TreeGridApp,C# Demo,
WPF视觉软件源码,Halcon机器视觉和运动控制软件框架源码,WPF MVVM开发模式,1:1参考easyvision开发,集成几十个软件算子,纯源代码,上手可用。WPF MVVM开发模式,插件框架。 注意:此版本以添加ui设计器。具体...
wpf 三态树设计实例和效果截图 wpf 三态树设计实例
调试wpf-wpf可视化树+辅助类
WPF树形控件实例程序,可直接编译通过。代码使用MVVM形式。
WPF TreeView绑定集合生成树 WPF TreeView绑定集合生成树
WPF 下拉框树状通用控件,下载即可使用
C# wpF指南 如搭建Vista程序的开发环境,WPF指南之XAML概述,WPF指南之WPF的结构,WPF的逻辑树和视觉树,WPF中的传递事件等
ProgramLoopTree 编程遍历逻辑树和视觉树。 RegisterAttached 注册附加属性。 RoutingStrategyDemo 演示如何使用路由策略。 SharedDP 共享依赖属性示例。 StackPanelLoadedDemo WPF中元素的生命...
使用WPF做的一个树形的省市县级联菜单 非常好