在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF 。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。Follow他的博客也有一段日子了,很希望能够分享给大家。

  本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。

  在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。

  前文:<1-7>, <8-14>,<15-21>,<22-27>, <28-33>,<34-39>,<40-44>

  [小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂cnblogs.com/xfuture]


  #45 Logical Tree 逻辑树

  WPF逻辑树是用户界面元素的层次结构关系的树状图。如果你的UI是在Xaml里定义的,逻辑树就是Xaml中元素整合为具有父子关系的树的模型。它描述了在运行时这些元素之间的关系。逻辑树可以帮助我们理解:

  1. Resource lookup 资源查找

  2. Property inheritance 属性继承

  3. Event routing 路由事件。

  下面有个例子:

  

<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="A window.." Height="350" Width="525">
<StackPanel>
<Button Content="Click Me" Height="23" HorizontalAlignment="Left" Width="75" Click="button1_Click" />
<TextBox />
<ListBox>
<ListBoxItem Content="Barley"/>
<ListBoxItem Content="Oats"/>
</ListBox>
</StackPanel>
</Window>

  逻辑树的模型是:

  

  

  

  #46 代码中寻找逻辑树

  你可以使用LogicalTreeHelper.GetChildren方法来遍历逻辑树并列出所有在逻辑树上的对象。

  在逻辑树上(LogicTree)上所有的元素都是DependencyObject, 你可以通过调用GetChildren方法获得上层对象的所有子对象,并返回其集合。

  

// Enumerate each immediate child of main window.  (Does NOT descend down tree)
foreach (Object obj in LogicalTreeHelper.GetChildren(mainWindow as DependencyObject))
Debug.WriteLine(obj.ToString());

  你可以通过嵌套循环来列出所有的子元素。

  #47 查看逻辑树小工具

  下面介绍一个可以查看逻辑树的小工具。

  用法:将.XAML文件拖入窗口即可展示其逻辑树。它内部机制是调用LogicalTreeHelper.GetChildren来获得子元素并展示在一个treeview的控件上。

  

  下载地址:DisplayWpfTrees.zip 源代码:WPFLogicalTree project

  该工具更详细的介绍:An Application to Let You View WPF Logical Trees

 #48 视觉树(Visual tree)

  WPF视觉树打破了逻辑树的框,深入到内部,展示了更低level的元素。在逻辑树中的元素是XAML中一般的控件,而视觉树中会显示所有基本的视觉元素。所有在视觉树上显示的元素都继承自Visual or Visual3D。

  例子:

  

<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml>
<StackPanel>
<Button Content="Click Me" />
<TextBox />
<ListBox>
<ListBoxItem Content="Barley"/>
<ListBoxItem Content="Oats"/>
</ListBox>
</StackPanel>
</Window>

  其视觉树:

  

Window
Border
AdornerDecorator
ContentPresenter
StackPanel
Button
ButtonChrome
ContentPresenter
TextBlock
TextBox
ListBoxChrome
ScrollViewer
Grid
Rectangle
ScrollContentPresenter
TextBoxView
TextBoxLineDrawingVisual
AdornerLayer
Scrollbar
Scrollbar
ListBox
Border
ScrollViewer
Grid
Rectangle
ScrollContentPresenter
ItemsPresenter
VirtualizingStackPanel
ListBoxItem
Border
ContentPresenter
TextBlock
ListBoxItem
Border
ContentPresenter
TextBlock
AdornerLayer
ScrollBar
Scrollbar
AdornerLayer

  

  #49 代码中寻找视觉树

  你可以使用VisualTreeHelper.GetChildrenCountGetChild方法来遍历视觉树并列出所有在视觉树上的对象。

  你可以使用循环来获得所有的视觉树上的元素:

  

for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
Debug.WriteLine(VisualTreeHelper.GetChild(obj, i));

  

  #50 查看视觉树小工具

  下面介绍一个可以查看视觉树的小工具。

  用法:将.XAML文件拖入窗口即可展示其视觉树。它内部机制是调用VisualTreeHelper.GetChildren来获得子元素并展示在一个treeview的控件上。

   

  下载地址:DisplayWpfTrees.zip 源代码:WPFVisualTree project   

  更多信息:An Application to Let You View WPF Visual/Logical Trees

  

  后篇会对WPF内部机制继续做探索,敬请关注!

  如果觉得有帮助,右下角赞一下吧~ (* *)

2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>的更多相关文章

  1. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  2. 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  3. 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  4. 2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  5. 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  6. 2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  7. 2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>

    前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件 ...

  8. 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  9. 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

随机推荐

  1. 【AR实验室】ARToolKit之Example篇

    0x00 - 前言 PS : 我突然意识到ARToolKit本质可能就是一个可以实时求解相机内外参的解决方案. 拿到一个新的SDK,90%的人应该都会先跑一下Example.拿到ARToolKit的S ...

  2. node服务的监控预警系统架构

    需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...

  3. 02.LoT.UI 前后台通用框架分解系列之——灵活的菜单栏

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  4. ExtJS 4.2 业务开发(三)数据添加和修改

    接上面的船舶管理业务,这里介绍添加和修改操作. 目录 1. 添加操作 2. 修改操作 3. 在线演示 1. 添加操作 1.1 创建AddShipWindow.js 在业务中的view目录下创建一个Ad ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(73)-微信公众平台开发-消息管理

    系列目录 前言 回顾上一节,我们熟悉的了解了消息的请求和响应,这一节我们来建立数据库的表,表的设计蛮复杂 你也可以按自己所分析的情形结构来建表 必须非常熟悉表的结果才能运用这张表,这表表的情形涵盖比较 ...

  6. jQuery.template.js 简单使用

    之前看了一篇文章<我们为什么要尝试前后端分离>,深有同感,并有了下面的评论: 我最近也和前端同事在讨论这个问题,比如有时候前端写好页面给后端了,然后后端把这些页面拆分成很多的 views, ...

  7. await and async

    Most people have already heard about the new “async” and “await” functionality coming in Visual Stud ...

  8. .NET面试题集锦②(Part 二)

    一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.实现产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复. ]; ArrayList my ...

  9. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...

  10. Spring注解

    AccountController .java Java代码   1.        /** 2.         * 2010-1-23 3.         */ 4.        packag ...