WPF中提供了遍历逻辑树和视觉树的辅助类:System.Windows.LogicalTreeHelper和 System.Windows.Media.VisualTreeHelper。 注意遍历的位置,逻辑树可以在类的构造函数中遍历。但是,视觉树必须在经过至少一次的布局后才能形成。 所以它不能在构造函数遍历。通常是在OnContentRendered进行,这个函数为在布局发生后被调用。 其实每个Tree结点元素本身也包含了遍历的方法。 比如,Visual类包含了三个保护成员方法VisualParent、 VisualChildrenCount、GetVisualChild。通过它们可以访问Visual的父元素和子元素。而对于 FrameworkElement,它通常定义了一个公共的Parent属性表示其逻辑父元素。 特定的FrameworkElement子类用不同的方式暴露了它的逻辑子元素。比如部分子元素是Children Collection,有是有时Content属性,Content属性强制元素只能有一个逻辑子元素。

为了方便理解,直接上代码:

前台XAML代码如下:

  1. <Window x:Class="WpfApp1112.Window2"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="Window2" Height="" Width="">
  5. <StackPanel>
  6. <Label>Hello,world!</Label>
  7. </StackPanel>
  8. </Window>

后台代码如下:

  1. /// <summary>
  2. /// Window2.xaml 的交互逻辑
  3. /// </summary>
  4. public partial class Window2 : Window
  5. {
  6. public Window2()
  7. {
  8. InitializeComponent();
  9. printLogincalTree(, this);
  10. }
  11. protected override void OnContentRendered(EventArgs e)
  12. {
  13. base.OnContentRendered(e);
  14. printVisualTree(,this);
  15. }
  16.  
  17. /// <summary>
  18. /// 打印逻辑树
  19. /// </summary>
  20. /// <param name="depth"></param>
  21. /// <param name="obj"></param>
  22. void printLogincalTree(int depth, object obj)
  23. {
  24. Debug.WriteLine(new string(' ', depth) + obj); //打印空格,方便查看
  25.  
  26. if (!(obj is DependencyObject)) return; //如果不是DependencyObject,如string等类型
  27.  
  28. //递归打印逻辑树
  29. foreach (object child in LogicalTreeHelper.GetChildren(obj as DependencyObject))
  30. {
  31. printLogincalTree(depth + , child);
  32. }
  33. }
  34.  
  35. /// <summary>
  36. /// 打印视觉树
  37. /// </summary>
  38. /// <param name="depth"></param>
  39. /// <param name="obj"></param>
  40. void printVisualTree(int depth, DependencyObject obj)
  41. {
  42. Debug.WriteLine(new string(' ', depth) + obj); //打印空格,方便查看
  43.  
  44. //递归打印视觉树
  45. for (int i = ; i < VisualTreeHelper.GetChildrenCount(obj); i++)
  46. {
  47. printVisualTree(depth + , VisualTreeHelper.GetChild(obj, i));
  48. }
  49. }
  50. }

打印结果如下:

【WPF】逻辑树和视觉树的更多相关文章

  1. WPF的逻辑树与视觉树(3)Visual呈现

    原文:WPF的逻辑树与视觉树(3)Visual呈现 这篇就点到为止,挑重点讲 绘图方式有两种 1.继承UIElement,重写OnRender方法 public partial class Windo ...

  2. WPF的逻辑树与视觉树(1)基本概念

    原文:WPF的逻辑树与视觉树(1)基本概念     一.摘要 逻辑树与视觉树属于WPF的基本概念,学过WPF或者Silverlight的朋友一定会对其有所耳闻,这篇文章将来探讨逻辑树与视觉树的特质以及 ...

  3. WPF的逻辑树与视觉树(2)Visual容器

    原文:WPF的逻辑树与视觉树(2)Visual容器   一.摘要 虽然我们平时几乎不会从该类派生,但要想了解视觉树就必须要了解Visual,Visual是一个基本抽象类,继承自DependencyOb ...

  4. WPF的逻辑树和视觉树

    原文:WPF的逻辑树和视觉树 这部分的内容来自于即将出版的新书<WPF Unleashed>的第三章样章.关于什么是逻辑树,我们先看下面的一个伪XAML代码的例子: <Window ...

  5. wpf 逻辑树与可视化树

    XAML天生就是用来呈现用户界面的,这是由于它具有层次化的特性.在WPF中,用户界面由一个对象树构建而成,这棵树叫作逻辑树.逻辑树的概念很直观,但是为什么要关注它呢?因为几乎WPF的每一方面(属性.事 ...

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

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

  7. 理解WPF中的视觉树和逻辑树

    轉載地址:http://blog.csdn.net/changtianshuiyue/article/details/26981797 理解WPF中的视觉树和逻辑树  Understanding th ...

  8. WPF学习(4)逻辑树和可视树

    前面几节说了一些WPF的基础,包括XAML和布局等.在接下来的几节,我们来说说WPF的核心概念,包括逻辑树和可视树.依赖对象和依赖属性.路由事件.命令这几个部分.本节介绍下逻辑树(Logical Tr ...

  9. WPF中的逻辑树和可视化树

    WPF中的逻辑树是指XAML元素级别的嵌套关系,逻辑树中的节点对应着XAML中的元素. 为了方便地自定义控件模板,WPF在逻辑树的基础上进一步细化,形成了一个“可视化树(Visual Tree)”,树 ...

随机推荐

  1. 编译Android4.3内核源代码

     --------------------------------------------------------------------------------------------------- ...

  2. Android动态加载技术初探

    一.前言: 现在,已经有实力强大的公司用这个技术开发应用了,比如淘宝,大众点评,百度地图等,之所以采用这个技术,实际上,就是方便更新功能,当然,前提是新旧功能的接口一致,不然会报Not Found等错 ...

  3. spring scheduler相同时间内执行两次的问题

    在网上找了大片文章,有的说是上下文被夹在两次的问题,可我配置scheduler的上下文着实没被夹在多次 之后才在网上找到,虽然还不明白原理,但是还是贴出来分享下

  4. [ES6] 22. Const

    'const' keyword is for creating a read only variable, something you can never change once created. ' ...

  5. C# Attribute(中)——Attribute本质论

      小序:                   上篇里,我们把Attribute“粘”在类的成员方法上show了一把,让Attribute跟大家混了个脸儿熟.中篇里,我们将探讨“究竟什么是Attrib ...

  6. JS问题Uncaught ReferenceError:XXXX is not defined

    背景: html中一个table,table中进行分页.每行后面有一系列操作,如删除,修改.现在以删除为例说明问题. 实现方式: 使用button,在onclick中调用js函数,js函数中传递参数如 ...

  7. Socket解决粘包问题2

    在AsynServer中对接收函数增加接收判断,如果收到客户端发送的请求信息,则发送10个测试包给发送端,否则继续接收,修改后的接收代码如下: private void AsynReceive() { ...

  8. 修改浏览器User-Agent

    IE: 1,F12进入开发人员工具 2,工具->更改用户代理字符串->自定义 3,在"友好名称"中填入"IE9",在"用户代理字符串&qu ...

  9. FWFT FIFO读操作注意

    FWFT:First Word Fall Through的缩写,好像是Xilinx的说法,Altera对应的概念是Show-ahead synchronous(SASO).即数据在rdreq有效之前就 ...

  10. JS设置打印页面并调用本地打印机打印页面

    <script type="text/javascript"> var hkey_key; var hkey_root = "HKEY_CURRENT_USE ...