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

摘要:
MSDN中介绍逻辑树在WPF框架级别,即FrameworkElement或FrameworkContentElement)类级别。可以使用LogicalTreeHelper进行逻辑树中对象的遍历查找。可视化树则是基于Visual基类,Visual基类的主要角色是提供呈现支持,包括输出显示、转换、裁剪、命中测试、边框计算。可以参考WPF体系结构。

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

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代码如下:

usingSystem.Windows;
usingSystem.Windows.Controls;
namespaceWpfApp1
{
    /// <summary>
    ///MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial classMainWindow : Window
    {
        publicMainWindow()
        {
            InitializeComponent();
            this.Loaded +=MainWindow_Loaded;
        }
        private void MainWindow_Loaded(objectsender, RoutedEventArgs e)
        {
            Image image = newImage();
            TextBlock textBlock = newTextBlock();
            textBlock.Text = "Clack";
            StackPanel stackPanel = newStackPanel();
            stackPanel.Children.Add(image);
            stackPanel.Children.Add(textBlock);
            Button button = newButton();
            button.Width = 100;
            button.Height = 30;
            button.Content =stackPanel;
            this.grid.Children.Add(button);
        }
    }
}

运行之后:

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

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

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

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

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

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

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

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

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

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

可以参考WPF体系结构

免责声明:文章转载自《WPF知识点全攻略06- WPF逻辑树(Logical Tree)和可视树(Visual Tree)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何在CentOS 7中禁止IPv6Win7 计算机(我的电脑)右键菜单“管理”打不开,解决方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

串口通信类,WPF

参考之前的资料,写了一个自己常用的串口类, 字符串发送类型用了两种方式,char[] 和byte[] ; 数据接收也是采用两种 char[] 和byte[] 两种。 类代码贴出来: public class SerialPortManager { private bool _recStaus = true;//接收状态字...

03- web表单测试

软件分为 b/s c/s两种架构 表单测试 1.用户注册,登录,信息提交。 2.用户查询商品。 3.用户订购商品。 4.用户查询订单等。 表单测试实例   表单数据添加测试(一) 添加按钮可用,测试点击添加按钮,能够进入响应的添加页面; 进入添加页面,验证输入字段和需求描述一致; 所有的输入字段输入合法数据;  表单数据添加测试(二) 重复提交信息,如一...

WPF自定义窗口(Windows Server 2012 Style)

先上图 新建CustomControl,名:HeaderedWindow ThemesGeneric.aml文件夹下加入 笔刷,转换器 1 <SolidColorBrush x:Key="ActiveBackground" Color="#FF66CBEA"/> 2 <SolidColorBrush x:Key="De...

SweetAlert弹窗使用

所需文件只有两个,一个是css,一个是js,网上比较难找,所以已上传到网盘,需要可自行下载 链接:https://pan.baidu.com/s/1ROWJqG3pzqBD7uxqLPMqtw 提取码:abab 就像这样,直接引用即可 <link rel="stylesheet" href="../statics/sweetalert/sweeta...

关于防止表单多次提交~按钮多次点击~限制点击事件

为了防止用户多次提交表单我们可以有多种处理方法,以下做一些简单的说明 1.通过css设置属性 pointer-events: none;   这个属性是css的特殊属性,他更像是javaScript,它能: 阻止用户的点击动作产生任何效果 阻止缺省鼠标指针的显示 阻止CSS里的 hover 和 active 状态的变化触发事件 阻止JavaScript点...

Repeater控件中点击按钮后获取某一行的数据!

其实和GridView差不多的,如果模板中是有按钮之类的可以设置CommandName值的,可直接在ItemCommand事件中获取CommandName或者CommandArgument, 如果是模板中有文本框之类的,把文件框的AutoPostBack属性设置为True,然后在TextChanged事件中编写如下代码: C#代码 TextBoxt=(...