【WPF】逻辑树和视觉树
WPF中提供了遍历逻辑树和视觉树的辅助类:System.Windows.LogicalTreeHelper和 System.Windows.Media.VisualTreeHelper。 注意遍历的位置,逻辑树可以在类的构造函数中遍历。但是,视觉树必须在经过至少一次的布局后才能形成。 所以它不能在构造函数遍历。通常是在OnContentRendered进行,这个函数为在布局发生后被调用。 其实每个Tree结点元素本身也包含了遍历的方法。 比如,Visual类包含了三个保护成员方法VisualParent、 VisualChildrenCount、GetVisualChild。通过它们可以访问Visual的父元素和子元素。而对于 FrameworkElement,它通常定义了一个公共的Parent属性表示其逻辑父元素。 特定的FrameworkElement子类用不同的方式暴露了它的逻辑子元素。比如部分子元素是Children Collection,有是有时Content属性,Content属性强制元素只能有一个逻辑子元素。
为了方便理解,直接上代码:
前台XAML代码如下:
<Window x:Class="WpfApp1112.Window2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window2" Height="" Width="">
<StackPanel>
<Label>Hello,world!</Label>
</StackPanel>
</Window>
后台代码如下:
/// <summary>
/// Window2.xaml 的交互逻辑
/// </summary>
public partial class Window2 : Window
{
public Window2()
{
InitializeComponent();
printLogincalTree(, this);
}
protected override void OnContentRendered(EventArgs e)
{
base.OnContentRendered(e);
printVisualTree(,this);
} /// <summary>
/// 打印逻辑树
/// </summary>
/// <param name="depth"></param>
/// <param name="obj"></param>
void printLogincalTree(int depth, object obj)
{
Debug.WriteLine(new string(' ', depth) + obj); //打印空格,方便查看 if (!(obj is DependencyObject)) return; //如果不是DependencyObject,如string等类型 //递归打印逻辑树
foreach (object child in LogicalTreeHelper.GetChildren(obj as DependencyObject))
{
printLogincalTree(depth + , child);
}
} /// <summary>
/// 打印视觉树
/// </summary>
/// <param name="depth"></param>
/// <param name="obj"></param>
void printVisualTree(int depth, DependencyObject obj)
{
Debug.WriteLine(new string(' ', depth) + obj); //打印空格,方便查看 //递归打印视觉树
for (int i = ; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
printVisualTree(depth + , VisualTreeHelper.GetChild(obj, i));
}
}
}
打印结果如下:

【WPF】逻辑树和视觉树的更多相关文章
- WPF的逻辑树与视觉树(3)Visual呈现
原文:WPF的逻辑树与视觉树(3)Visual呈现 这篇就点到为止,挑重点讲 绘图方式有两种 1.继承UIElement,重写OnRender方法 public partial class Windo ...
- WPF的逻辑树与视觉树(1)基本概念
原文:WPF的逻辑树与视觉树(1)基本概念 一.摘要 逻辑树与视觉树属于WPF的基本概念,学过WPF或者Silverlight的朋友一定会对其有所耳闻,这篇文章将来探讨逻辑树与视觉树的特质以及 ...
- WPF的逻辑树与视觉树(2)Visual容器
原文:WPF的逻辑树与视觉树(2)Visual容器 一.摘要 虽然我们平时几乎不会从该类派生,但要想了解视觉树就必须要了解Visual,Visual是一个基本抽象类,继承自DependencyOb ...
- WPF的逻辑树和视觉树
原文:WPF的逻辑树和视觉树 这部分的内容来自于即将出版的新书<WPF Unleashed>的第三章样章.关于什么是逻辑树,我们先看下面的一个伪XAML代码的例子: <Window ...
- wpf 逻辑树与可视化树
XAML天生就是用来呈现用户界面的,这是由于它具有层次化的特性.在WPF中,用户界面由一个对象树构建而成,这棵树叫作逻辑树.逻辑树的概念很直观,但是为什么要关注它呢?因为几乎WPF的每一方面(属性.事 ...
- 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 理解WPF中的视觉树和逻辑树
轉載地址:http://blog.csdn.net/changtianshuiyue/article/details/26981797 理解WPF中的视觉树和逻辑树 Understanding th ...
- WPF学习(4)逻辑树和可视树
前面几节说了一些WPF的基础,包括XAML和布局等.在接下来的几节,我们来说说WPF的核心概念,包括逻辑树和可视树.依赖对象和依赖属性.路由事件.命令这几个部分.本节介绍下逻辑树(Logical Tr ...
- WPF中的逻辑树和可视化树
WPF中的逻辑树是指XAML元素级别的嵌套关系,逻辑树中的节点对应着XAML中的元素. 为了方便地自定义控件模板,WPF在逻辑树的基础上进一步细化,形成了一个“可视化树(Visual Tree)”,树 ...
随机推荐
- Numeral.js 是一个用于格式化和数字四则运算的js 库
1.Numeral.js 是一个用于格式化和数字四则运算的js 库. 2.支持多种语言,包含中文在内的17种语言. 在浏览器中引用js文件: <script src="numeral. ...
- Linux--------------安装tomcat8
系统: CentOS 7.2x64最小化安装 IP: 192.168.0.171 二.安装JDK环境 JDK(Java Development Kit) 是 Java 语言的软件开发 ...
- FileFilter, FilenameFilter用法和文件排序
FileFilter和FilenameFilter这两个类的用法都很简单,都只有一个方法 FileFilter /*** @param pathname The abstract pathname t ...
- arcgis python 获得所有的工具名称
#######################import arcgisscripting import string; gp = arcgisscripting.create(9.3); ### ...
- java.sql.SQLException: Before start of result set
在使用JDBC查询数据库报了这么一个错误 CREATE TABLE `d_user` ( `id` int(10) NOT NULL, `name` varchar(10) DEFAULT NULL, ...
- CentOS6.4安装ati显卡驱动
台式机安装CentOS 6.4 x86_64位 集成显卡ati4290 CentOS的release notes上: The proprietary drivers for older AMD ( ...
- java strtus2 DynamicMethodInvocation配置入门 " ! "访问action里面的方法
这里来讲解一下strtus2动态配置的用法. 配置之后不用通过 <action method="">去配置调用的具体方法. 第一:web.xml <?xml ve ...
- Linux操作系统搭建LAMP开发环境
Step1. 安装 Apache 在terminal中输入命令 sudo apt-get install apache2 打开浏览器,在地址栏输入:127.0.0.1,如果出现了 “It works! ...
- 20160406javaweb 之JDBC简单案例
前几天写的user注册登录注销案例,没有用到数据库,现在做出改动,使用数据库存储信息: 一.首先我们需要建立一个数据库: 如下图: 创建数据库的代码如下: -- 导出 database02 的数据库结 ...
- MongoDB中的分组
一.MongoDB中的Count函数.Distinct函数以及分组 准备工作,插入一个班级的文档 > for(var i=0;i<10;i++){ ... db.Classes.inser ...