WPF知识点全攻略06-WPF逻辑树(Logical Tree)和可视树(Visual Tree)

介绍概念之前,先来分析一段代码:

xaml代码如下:

<Window x:Class="WpfApp1.MainWindow"
        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"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <UniformGrid x:Name="grid">
        <Button Height="30" Width="120" >
            <StackPanel>
                <Image/>
                <TextBlock>Clack</TextBlock >
            </StackPanel>
        </Button>

        <Button Height="30" Width="120" >
            <StackPanel>
                <Image/>
                <TextBlock>Clack</TextBlock >
            </StackPanel>
            <Button.Template >
                <ControlTemplate TargetType =‘Button‘>
                    <ContentPresenter Content =‘{TemplateBinding Content }‘/>
                </ControlTemplate >
            </Button.Template >
        </Button>

    </UniformGrid>
</Window>

xaml.cs代码如下:

using System.Windows;
using System.Windows.Controls;

namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += MainWindow_Loaded;
        }
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Image image = new Image();

            TextBlock textBlock = new TextBlock();
            textBlock.Text = "Clack";

            StackPanel stackPanel = new StackPanel();
            stackPanel.Children.Add(image);
            stackPanel.Children.Add(textBlock);

            Button button = new Button();
            button.Width = 100;
            button.Height = 30;
            button.Content = stackPanel;

            this.grid.Children.Add(button);
        }
    }
}

运行之后:

接下来我们把xaml及xaml.cs中的代码合起来的逻辑树和代码运行后呈现的可视化树画出来:

通过上面对比,下面看出几个特点:

1、Button的Content内容,是在Button的Templete控件模板中的ContentPresenter中呈现的。

2、逻辑树中展示出来的不是所有的节点,1、3的Button也都有ContentPresenter等隐藏未显示。

3、逻辑树的节点,在可视化树的结构中都有表现,且可视化树表现出更多的节点。

4、逻辑树表现出来"界面"的构建过程、而可视化树表现出了“界面”的构建结构。

MSDN中介绍逻辑树在 WPF 框架级别,即FrameworkElement或 FrameworkContentElement)类级别。可以使用LogicalTreeHelper进行逻辑树中对象的遍历查找。

可视化树(Visual Tree)则是基于Visual基类,Visual基类的主要角色是提供呈现支持,包括输出显示、转换、裁剪、命中测试、边框计算。可以使用VisualTreeHelper来遍历可视化树。

可以参考WPF体系结构

原文地址:https://www.cnblogs.com/kuangxiangnice/p/11046239.html

时间: 2024-10-10 03:27:19

WPF知识点全攻略06-WPF逻辑树(Logical Tree)和可视树(Visual Tree)的相关文章

WPF知识点全攻略05-XAML内容控件

此处简单列举出布局控件外,其他常用的控件: Window:WPF窗口 UserControl:用户控件 Page:页 Frame:用来浏览Page页 Border:嵌套控件,提供边框和背景. Button:按钮控件 Calendar:日历.挂历 CheckBox:多选控件 ComboBox:下拉控件 ContentControl:内容控件,可以用于加载自定义UserControl控件 DataGrid:数据列表控件 DatePicker:日期选择器 DocumentViewer:文档查看,可以用

WPF知识点全攻略07- 数据绑定(Binding)

数据绑定是WPF不得不提,不得不会系列之一 数据绑定简言之,就是把数据源的数据绑定到目标对象的属性上.目标对象可以是承自DependencyProperty的任何可访问的属性或控件,目标属性必须为依赖属性(下节讲),数据源可以是其他控件的属性,可以是对象实例.XAML 元素.ADO.NET Dataset.XML数据. 数据绑定的重点属性- Mode属性: MSDN给出如下图标记了三种你来我往的数据流向.比较简单,看图就能明白. 数据绑定的重点属性- UpdateSourceTrigger属性:

WPF知识点全攻略04-XAML页面布局

名称 说明 Canvas 使用固定坐标绝对定位元素 StackPanel 在水平或竖直方向放置元素 DockPanel 根据外部容器边界,自动调整元素 WrapPanel 在可换行的行中放置元素 Grid 根据不可见的表格在行和列中排列元素,最常用 UniformGid 在不可见的相同尺寸的表格中放置元素 1.Canvas布局 <Canvas> <Rectangle Canvas.Left="50" Canvas.Top="50" Width=&q

工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!

原文:工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)! 如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥>承蒙大家喜爱和编辑推荐,在此非常感谢大家支持.在回复中我发现很多朋友还在使用老的IDE,当然有些是公司决定的,和个人无关.但是有条件的话还是新的IDE比较适合大家,毕竟新的IDE会有新的特性来减少大家编程时间,

FPGA开发全攻略——FPGA发展以及赛灵思系列产品

原文链接: FPGA开发全攻略连载之八:从可编程器件发展看FPGA未来趋势 FPGA开发全攻略连载之九:FPGA主要供应商与产品(1) FPGA开发全攻略连载之九:FPGA主要供应商与产品(2) FPGA开发全攻略连载之九:FPGA主要供应商与产品(3) 可编程逻辑器件的发展历史可编程逻辑器件的发展可以划分为4个阶段,即从20世纪70年代初到70年代中为第1段,20世纪70年代中到80年代中为第2阶段,20世纪80年代到90年代末为第3阶段,20世纪90年代末到目前为第4阶段. 第1阶段的可编程

前台页面优化全攻略(三)

经过前两篇文章的实践,你的网站加载速度一定有了非常明显的变化.能把实践跟到这篇文章的人想必一定是极客中的极客.如果你仍对网站的加载速度不满意,可以看看再尝试一下本文中几近疯狂的终极优化方案. 你可以对网站进行快速的优化,但网站日常的节食却很难.也许你已经花了很大的力气去优化你的CSS和JavaScript代码,但是你所做的努力马上又会因为老板或客户期望的新功能而付之东流.所以看来不论是人还是网页,减肥都贵在坚持. 这篇终极减肥方案可能不适合所有的网站,但是我相信它可以引起你对网页大小的重视. 1

超级实用!全郑州地铁沿线景点美食全攻略(附首末班时间表)

超级实用!全郑州地铁沿线景点美食全攻略(附首末班时间表) 2017-04-20小金豆郑州微公交 玩得劲 春天在哪里呀? 春天在哪里? 小编总结了 郑州地铁线路景点美食大全 及最新地铁首末班时刻表 最美人间四月天 快跟着小编 坐上地铁去旅行吃美食吧 别忘备上纸巾擦口水啊~ 一 郑州地铁沿线最全景点美食一览 1 1号线 龙子湖站 龙子湖 票价:免费 地址:郑东新区新107国道以东 市体育中心站 中原网球中心 票价:免费 地址:金水区金水东路附近 固始菜家庭餐馆 人均:¥20 地址:金水东路与明理路交

SQL Server 备份和还原全攻略

原文:SQL Server 备份和还原全攻略 一.知识点 完全备份: 备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件.(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份,换言之,清除存档属性).完全备份也叫完整备份. 差异备份: 差异备份是针对完全备份:备份上一次的完全备份后发生变化的所有文件.(差异备份过程中,只备份有标记的那些选中的文件和文件夹.它不清除标记,即:备份后不标记为已备份文件,换言之,不清除存档属性). 增量备份: 增量备份是针对于上一次备份(无论是

战斗bug技巧全攻略

程序员不是有一幅这样的对联吗 上联:一个项目两部电脑三餐盒饭只为四千工资搞得五脏俱损六神无主仍然七点起床八点开会处理九个漏洞十分辛苦: 下联:十年编码九年加班八面无光忙的七窍生烟到头六亲不认五体投地依旧四肢酸软三更加班只为二个臭钱一生孤苦: 横批:苦逼程序员. 其实,程序员职业生涯总结起来就这三件事情Ⅰ理解需求 Ⅱ编码 Ⅲ改bug. 可见,bug是程序员的天敌.bug对于我们自己名誉和产品自身质量影响是不言而喻的.哪么,怎么能够降低bug了. 卡耐基说过,人性的弱点要克服.程序员必须克服一些自身