说明:本系列基本上是《WPF揭秘》的读书笔记。在结构安排与文章内容上参照《WPF揭秘》的编排,对内容进行了总结并加入一些个人理解。

WPF中,XAML来呈现用户界面,其层次化的特性构建了用户界面需要的对象树,这棵树为逻辑树。通过XAML与过程式代码(C#)都可以实现逻辑树。逻辑树概念很重要,其与WPF的属性,事件,资源等很多方面相关联。如属性值会沿着树自动传递给子元素(后文要介绍的依赖属性),而触发的事件可以自底向上或自顶向下遍历树(后文要介绍的路由事件)。

可视树类似于逻辑树,其基本上是逻辑树的扩展,在可视树中,节点都被打散,分散到核心可视组件,这样其就提供了一些详细的可视化实现。

如逻辑树中的节点ListBox在可视化树中对应到一个Border对象,两个ScrollBar及其它元素。

只有由System.Window.Media.Visual或System.Window.Media.Visual3D派生的元素才会出现可视树中。其它元素不出现在可视树中的原因很简单 – 它们并没有呈现自己的能力。

查看可视树的方法,将XAML复制到XamlPad中,将最外层容器由Window改为Page(并删除SizeToContent属性),这样点击相应按钮就可以看XAML对应的可视树(及其中每个元素的属性),下面给出一个示例:

XAML代码:

<StackPanel><Label FontWeight="Bold" FontSize="20"   Foreground="White" Background="OrangeRed">Show Visual Tree</Label><Label>by hystar</Label><ListBox><ListBoxItem>Chapter 1</ListBoxItem><ListBoxItem>Chapter 2</ListBoxItem></ListBox><StackPanel Orientation="Horizontal"   HorizontalAlignment="Center"><Button MinWidth="75"   Margin="10">Help</Button><Button MinWidth="75"   Margin="10">OK</Button></StackPanel><StatusBar>This is a StatusBar an bottom.</StatusBar>
</StackPanel>

将其拷贝到XamlPad中下方的<Grid>标签之间,上方显示出XAML时时解析的结果。

如下图:点击这个红色圆圈标记的按钮(Show/Hide visual tree),即可显示树状展示的可视化树与每个元素的属性的树状列表。

WPF中有一个核心原则就是 – 可视部分与逻辑部分分开。这两部分大致分别对应可视树与逻辑树。可视树会受到用户切换Window主题的影响,但逻辑树不会,其是静态的,动态添加删除元素也不会影响逻辑树。

使用System.Window.LogicalTreeHelper与System.Window.Media.VisualTreeHelper这两个类可以方便的遍历一段代码的逻辑树与可视树。下面是两个代码,分别实现遍历前文那段XAML代码的逻辑树与可视树:

遍历逻辑树:

C#:

public Window1()
{InitializeComponent();PrintLogicalTree(0, this);
}private void PrintLogicalTree(int depth, object   obj)
{//打印对象,使用前置空格表示深度Debug.WriteLine(new string(' ', depth) + obj);//判断叶节点是否为DependencyObject,如stringif (!(obj   is DependencyObject))return;//递归调用每个逻辑子节点foreach (object child in LogicalTreeHelper.GetChildren(obj as DependencyObject))PrintLogicalTree(depth + 1, child);
}protected override void OnContentRendered(EventArgs   e)
{base.OnContentRendered(e);PrintVisualTree(0, this);
}private void PrintVisualTree(int depth, DependencyObject   obj)
{//打印对象,使用前置空格表示深度Debug.WriteLine(new string(' ', depth) + obj);//递归调用每个可视子节点for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj);   i++)PrintVisualTree(depth + 1, VisualTreeHelper.GetChild(obj, i));
}

以上代码,构造函数中调用的函数就实现遍历逻辑树,这也证明了前文所述逻辑树的静态性。但可视树需要一次布局后才会生成,所以遍历可视树需要在布局完成后的Content Rendered事件处理函数OnContentRendered中遍历。

另外,元素自己的实例方法也可以操作两种树。

对于可视树,Visual类的3个protected成员VisualParent,VisualChildrenCount和GetVisualChild可以用来访问一个可视节点的父节点与子节点。

对于逻辑树,所有通用控件(如Button和Label)的基类,FrameworkElement的Parent公共属性用来访问父节点。对于子节点由此元素的Children集合属性提供,有些以Content提供(说明这个元素只能有一个子元素/节点,如Button与Label – 具体原因前文有说明)。

参考:

《WPF揭秘》

转载于:https://www.cnblogs.com/lsxqw2004/archive/2011/08/05/4554323.html

WPF,Silverlight与XAML读书笔记第六 - WPF新概念之一逻辑树与可视树相关推荐

  1. WPF,Silverlight与XAML读书笔记第八 - WPF新概念之三路由事件

    说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 路由事件是专门设计用于在元素树中使用的事件. ...

  2. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形

    原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...

  3. WPF,Silverlight与XAML读书笔记第三十七 - 可视化效果之Brush

    说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. Brush用于定义形状的填充,包括前景色与背 ...

  4. 《互联网信贷风险与大数据》读书笔记(六)

    第一节 巴塞尔新资本协议 1975年9月,巴塞尔委员会出台了第一个巴塞尔协议并在1983年5月进行细化,主要包括两个观点: 任何银行的国外机构都不能逃避监管 母国和东道国应共同承担的职责 旧资本协议在 ...

  5. 《Python从入门到实践》读书笔记——第六章 字典

    <Python从入门到实践>读书笔记--第六章 字典 1. 一个简单的字典 alien_0 = {'color': 'green', 'points': 5}print(alien_0[' ...

  6. ECMA-335(CLI)标准 读书笔记(第一部:概念和架构 第7章)

    上一篇:ECMA-335(CLI)标准 读书笔记(第一部:概念和架构 1~6章) 7.       CLS 7.1   介绍 CLS是一套倾向于提高语言互操作性的一套规则.我们应当遵循这些规则.11章 ...

  7. 《人工神经网络原理》读书笔记(六)-Boltzmann机

    全部笔记的汇总贴:<人工神经网络原理>-读书笔记汇总 一.随机型神经网络的提出 BP和Hopfield网络陷入局部最小点的原因 网络误差或能量函数构成了含有多个极小点的非线性超曲面: 网络 ...

  8. 《深入浅出DPDK》读书笔记(六):报文转发(run to completion、pipeline、精确匹配算法、最长前缀匹配LPM)

    本文内容为读书笔记,摘自<深入浅出DPDK> 65.网络报文的处理和转发主要分为硬件处理部分与软件处理部分,由以下模块构成: ❑Packet input:报文输入. ❑Pre-proces ...

  9. 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(3)

    <Microsoft Sql server 2008 Internals>读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397 ...

最新文章

  1. RocketMQ实战--大数据平台技术栈06
  2. web.config文件
  3. MySQL之慢查询日志分析
  4. PHP实现列表页综合筛选功能,dede织梦列表页联动筛选方法功能的实现
  5. matlab光学远轴光的折射,matlab模拟光的反射折射
  6. 组态王c语言编程实例,组态王命令语言程序.doc
  7. python3.7 ‘utf-8‘ codec can‘t decode byte 0xbe in position 0: invalid start byte
  8. Android中的事件分发和处理
  9. Linux篇 | 用户、组和权限(一)
  10. java lock代码写法_[代码全屏查看]-java lock的使用
  11. C语言文件的存储和处理实验报告,c语言文件处理实验报告(6页)-原创力文档...
  12. 自动网络设计(NAS)Randomly Wired Neural Networks 何凯明团队
  13. 抖音培训教程,抖音培训班,抖音培训课程(2019实时更新中) -
  14. 解决Win7的一个毛病——睡眠失效(只关闭显示器,不关主机)
  15. 【SpringCloud】Could not find artifact org.springframework.cloud:spring-cloud-starter-xxx
  16. Qt开发串口通信以及坐标显示程序并移植
  17. vue cli3及4版本的全局引入scss
  18. 【新书速递】实用安全多方计算导论
  19. 基于STM32的OLED显示
  20. 外贸电商数据平台(一) shopee

热门文章

  1. OpenCV-Python实战(番外篇)——利用增强现实制作美颜挂件,让你的照片与众不同
  2. daocloud创建mysql_DaoCloud体验-使用node构建应用程序
  3. jsf教程_JSF教程
  4. ssh无密码登录_3个简单步骤即可完成无密码SSH登录
  5. Java 11:字符串类中的新方法
  6. C# Word控件 dsoframer、office viewer、pageoffice、setparent
  7. 开课吧:Html5有哪些新特性?
  8. 使用后缀自动机求后缀数组
  9. ORACLE 11G DATAGUARD 日志中断处理方案
  10. 一个网络传输框架——zeroMQ 调研笔记