WPF-10 逻辑树和可视化树

我们在WPF-03 资源之Resources结尾中介绍逻辑树和可视化树的基本概念,我们这节来介绍这两棵树

逻辑树(Logical Tree)

逻辑树是由每个控件的节点组成,本质上就是XAML文件中的UI元素,我们可以通过LogicalTreeHelper类提供的静态方法获取逻辑树的对象,我们通过一个例子演示获取整个页面逻辑树

7d977bcb5dd0d1d59a1fac1f39584e24.png

<Window x:Class="Example_10.RepresentLogicalTree"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Example_10" mc:Ignorable="d" Title="RepresentLogicalTree" Height="450" Width="800"><Grid><Grid.RowDefinitions><RowDefinition Height="0.15*"></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal"><Button Name="btnLogical" Height="30" Click="btnClick_Click">展示逻辑树</Button><Label VerticalAlignment="Center" Margin="200,0,0,0">Label 控件</Label></StackPanel><StackPanel><TreeView Name="logicalTree"></TreeView></StackPanel></Grid>
</Window>
public partial class RepresentLogicalTree : Window{public RepresentLogicalTree(){InitializeComponent();}private void btnClick_Click(object sender, RoutedEventArgs e){logicalTree.Items.Add(GetLogicTree(this));}public static TreeViewItem GetLogicTree(DependencyObject obj){if (obj == null){return null;}TreeViewItem treeNode = new TreeViewItem { Header = obj.GetType().FullName, IsExpanded = true };foreach (var child in LogicalTreeHelper.GetChildren(obj)){var item = GetLogicTree(child as DependencyObject);if (item != null){treeNode.Items.Add(item);}}return treeNode;}}

我们可以很清晰的看到整个逻辑树节点对应到XAML页面中的元素

可视化树(Visual Tree)

可视化树是逻辑树的一种扩展,逻辑树的每个结点都被分解为核心视觉组件,逻辑树节点对我们来说是个黑箱,而视觉树暴露了视觉的实现细节,我们可以通过VisualTreeHelper类提供的静态方法获取可视化树节点,可视化树要比逻辑树呈现的粒度更细,XAML结构和上面结构相同,我们来呈现可视化树结构:

6a656d8b7f68279693a2fe86f92ecdc7.png

public partial class RepresentVisualTree : Window{public RepresentVisualTree(){InitializeComponent();}private void btnVisual_Click(object sender, RoutedEventArgs e){VisualTree.Items.Add(GetVisualTree(this));}public static TreeViewItem GetVisualTree(DependencyObject obj){if (obj == null){return null;}TreeViewItem treeNode = new TreeViewItem { Header = obj.GetType().FullName, IsExpanded = true };for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++){var child = VisualTreeHelper.GetChild(obj, i);var item = GetVisualTree(child);if (item != null){treeNode.Items.Add(item);}}return treeNode;}}

从上面的例子我们可以看到更细粒度的控件组成部件,下图展示了整个视觉图的组成,绿色表示可视化树,红色表示逻辑树,可视化树范围包含逻辑树

14b6d010e6ee00d78c74c05206c5295a.png

这节我们主要了解WPF中逻辑树和可视化树,通过本节希望能够加深对WPF中控件组成的部件的了解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产车崛起粉碎德日工业神话

由于二战战败&#xff0c;德国一大批顶尖人才被美苏瓜分&#xff0c;战败国地位和人才断层导致德国工业基本是第二次工业革命的产物&#xff0c;专精于机械、化工等传统行业&#xff0c;并有巴斯夫、拜尔、大众、戴姆勒、宝马等一批世界级企业。不过&#xff0c;德国世界级的IT…

java hibernate 分页查询_4 Hibernate HQL查询,分页查询

/*** HQL查询的一个例子*/public static void hql(){Session s null;try{s HibernateUtil.getSeesion();//final String hql "from User as u where u.name?";final String hql "from User as u where u.name:name";final Query query s.createQuery…

Linux -sed

sed &#xff0c;查找sed -n /root/p passwd #列出passwd中有root的行 sed -nr /ot/p passwd #sed -r grep -E 都是进行脱意 sed -nr /0{2}/p passwd #匹配两次o的 sed -nr /root|bus/p passwd #匹配root 或者bus的 sed -n 2p passwd # 查找指定的行sed -n 2,5p passwd # 查找…

node安装问题

1.最好安装到默认路径&#xff0c;手贱安到了D盘&#xff0c;升级npm各种出错。 明明升级成功&#xff0c;查看版本时&#xff0c;确显示依然是老的版本。 原因&#xff1a;升级的是C盘的node_modules中的npm&#xff0c;执行时确是D盘node自带的npm&#xff0c;不知道为啥。。…

通过url来设置log4j的记录级别

2019独角兽企业重金招聘Python工程师标准>>> 直接看代码。 import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotati…

通过用户模型,对数据库进行增删改查操作

增加&#xff1a;user db.session.add(user)db.session.commit() #增加 user User(username JACKSON,password0328 ) db.session.add(user) db.session.commit() 查询&#xff1a;User.query.filter(User.username mis1114).first() #查询 userUser.query.filter(User.usern…

Android OpenGL ES(七)----理解纹理与纹理过滤

1.理解纹理 OpenGL中的纹理能够用来表示图像。照片&#xff0c;甚至由一个数学算法生成的分形数据。每一个二维的纹理都由很多小的纹理元素组成。它们是小块的数据&#xff0c;类似于我们前面讨论过的片段和像素。要使用纹理&#xff0c;最经常使用的方式是直接从一个图像文件载…

WPF 基础控件之托盘

WPF 基础控件之托盘控件名&#xff1a;NotifyIcon作者&#xff1a; WPFDevelopersOrg - 吴锋|驚鏵原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可协议。新建NotifyIcon自定义…

java 匿名 异常_JAVA类(内部类、匿名内部类、异常、自定义异常)

内部类package AA;public class类 {int de123;StringBuffer deenewStringBuffer();public class成员内部类{public voidff() {System.out.println("这是成员内部类方法");}}/*1.可以访问外部类所有的成员&#xff0c;包括被声明为私有(private)的&#xff1b;2.可以使…

ASP.NET 多环境下配置文件web.config的灵活配置---转

注意&#xff1a;本功能在.Net Core中已经不可用&#xff0c;暂时需手动修改web.config中的信息&#xff0c;或者将其设置在appsettings.XXX.json中&#xff0c;然后再使用web.config中的环境变量来制定使用的具体appsettings文件。 转自&#xff1a;https://www.cnblogs.com/h…

Uranium UI Kit

Uranium UI Kit控件名&#xff1a;Uranium UI Ki作者&#xff1a;enisn原文链接&#xff1a; https://github.com/enisn/UraniumUI项目使用 Apache-2.0 开源许可协议。Uranium 是用于 .NET MAUI 的免费和开源 UI 工具包。它提供了一组控件和实用程序来构建现代应用程序。它建…

《Java多线程编程核心技术》读后感(十五)

线程的状态 线程对象在不同的运行时期有不同的状态&#xff0c;状态信息就存在与State枚举类中。 验证New,Runnable&#xff0c;Terminated new:线程实例化后还从未执行start()方法时的状态 runnable&#xff1a;线程进入运行的状态 terminated&#xff1a;线程被销毁时的状态 …

队列(queue)

队列(queue)和栈一样支持push和pop两个操作。但与栈不同的是,pop两个操作。但与栈的不同的是&#xff0c;pop完成的不是取出最顶端的元素&#xff0c;而是最底端的元素。也就是说最初放入的元素能够最先被取出&#xff08;这种行为被叫做FIFO:First In First Out&#xff0c;即…

一题多解,ASP.NET Core应用启动初始化的N种方案[上篇]

ASP.NET Core应用本质上就是一个由中间件构成的管道&#xff0c;承载系统将应用承载于一个托管进程中运行起来&#xff0c;其核心任务就是将这个管道构建起来。在ASP.NET Core的发展历史上先后出现了三种应用承载的编程方式&#xff0c;而且后一种编程模式都提供了针对之前编程…

WPF 简单模仿 VSCode 界面布局

WPF 简单模仿 VSCode 界面布局本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。WPF 简单模仿 VSCode 界面布局作者&#xff1a;弈虎-吕女士会翻墙原文链接&#xff1a; https://github.com/Chen-Lin-Zhao-Wei/WPFLikeVSCode分享一篇群友这几天自己写的 WPF 简…

compare()方法+使用compare方法

compare()方法 compare(lob1,lob2,amount,offset_1,offset_2) 1用于比较2个lob存储的数据&#xff0c;比较的方式是从指定偏移量开始&#xff0c;对指定数量的字符或者字节进行比较。 2如果比较内容相同&#xff0c;返回0&#xff0c;否则返回-1或1. 3如果参数设置有误或不合…

linux 下 mysql默认表_linux环境下mysql默认是区分表名大小写的

在linux环境下&#xff0c;mysql默认表明是区分大小写的&#xff0c;我们可以查看全局变量发现:mysql> show variables like lower%;-------------------------------| Variable_name | Value |-------------------------------| lower_case_file_system | OFF || lower_cas…

两将军问题和TCP三次握手

两将军问题&#xff0c;又被称为两将军悖论、两军问题&#xff0c; 是一个经典的计算机思想实验。首先&#xff0c; 为避免混淆&#xff0c;我们需要认识到两将军问题虽然与拜占庭将军问题相关&#xff0c;但两者不是一个东西。拜占庭将军问题是一个更通用的两将军问题版本&…

微信小程序开发系列五:微信小程序中如何响应用户输入事件

2019独角兽企业重金招聘Python工程师标准>>> 微信小程序开发系列教程 微信小程序开发系列一&#xff1a;微信小程序的申请和开发环境的搭建 微信小程序开发系列二&#xff1a;微信小程序的视图设计 微信小程序开发系列三&#xff1a;微信小程序的调试方法 微信小程序…

理解Object.defineProperty的作用

Object.defineProperty 是vue中双向绑定的基础。vue是通过数据劫持的方式来做数据绑定的&#xff0c;最核心的方法是通过 Object.defineProperty()方法来实现对属性的劫持&#xff0c;达到能监听到数据的变动。要实现数据的双向绑定&#xff0c; 当使用存取器描述属性的特性的时…