WPF学习笔记(1)WPF相关知识概述


一、WPF框架

1. 什么是WPF框架?

官方文档:https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/overview/
在这里插入图片描述

2. WPF与.Net的关系

在这里插入图片描述

3. WPF框架体系结构

在这里插入图片描述

4. WPF框架优势

在这里插入图片描述

二、XAML

1. XML概念

在这里插入图片描述
在这里插入图片描述

2. XAML概念

官方文档:https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/xaml/

在这里插入图片描述
在这里插入图片描述

3. XAML与XAML.CS的关系

在这里插入图片描述

4. XAML设计器

在这里插入图片描述

三、命名空间与映射

1.XML命名空间

在这里插入图片描述
在这里插入图片描述

2. XAML命名空间

官方文档:https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/advanced/xaml-namespaces-and-namespace-mapping-for-wpf-xaml
在这里插入图片描述

3. App.xaml介绍

在这里插入图片描述

4. MainWindow.xaml介绍

在这里插入图片描述

5. xmlns映射关系

在这里插入图片描述
在这里插入图片描述

6. xml元素映射CLR类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7. xmlns命名空间映射到当前程序集

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8. xmlns命名空间映射到自定义程序集

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9. 将CLR命名空间映射到程序集中的xml命名空间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、逻辑树与可视化树

WPF使用了若干树结构形式来定义程序元素之间的关系分为逻辑树可视化树帮助我们理解某些关键 WPF功能的行为,主要用于学习WPF布局结构。
官方文档:https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/advanced/trees-in-wpf
在这里插入图片描述

1. 逻辑树

逻辑树表示U的核心结构,和XAML文件中定义的元素几乎一致,排除掉内部生成的那些用来帮助渲染的可视化元素。

  • 事件处理:逻辑树对UI事件的处理起着重要的作用。当某个元素触发了一个事件时,WPF会自动沿着逻辑树向上搜索元素,找到第一个能够处理该事件的元素,并将事件传递给它进行处理。
  • 样式:WPF中的样式也是基于逻辑树实现的。我们可以通过在逻辑树中为某一类元素(例如Button)定义样式,从而使所有该类元素都具有相同的外观和行为。
  • 数据绑定:WPF中的数据绑定机制也是基于逻辑树实现的。我们可以通过在逻辑树中绑定元素的属性和数据源,从而实现UI元素与数据的自动更新。

LogicalTreeHelper类提供用于查询逻辑树中的对象的静态帮助器方法,部分属性如下:

属性说 明
GetChildren()通过处理逻辑树返回指定的对象的即时子对象集合。
FindLogicalNode( )尝试查找并返回具有指定名称的对象。搜索从指定对象开始,并持续到逻辑树的子节点中。
GetParent()通过处理逻辑树,返回指定对象的父对象。

MainWindow.xaml.cs内代码如下:

public partial class MainWindow : Window
{
    // 递归遍历逻辑树并打印元素名称
    private void PrintLogicalTree(DependencyObject element, string indent = "")
    {
        Console.WriteLine(indent + element.GetType().Name);
        foreach (object child in LogicalTreeHelper.GetChildren(element))
        {
            if (child is DependencyObject obj)
            {
                PrintLogicalTree(obj, indent + " ");
            }

        }
    }
    public MainWindow()
    {
        InitializeComponent();

        // 访问逻辑树结构

        Console.WriteLine("----------------逻辑树----------------");
        PrintLogicalTree(this);
        Console.WriteLine("--------------------------------------");
    }
}

2. 可视化树

可视化树是元素在屏幕上的可视化表示,例如按钮元素的可视化由3部分组成:使按钮具有阴影背景边框(由Border类 )、内部的容器(ContentPresenter类)以及按钮文本(TextBlock类)。

  • 图形渲染:可视化树决定了UI元素在屏幕上的呈现方式。WPF会通过递归遍历可视化树来确定每个元素的位置、大小、外观等属性,并使用对应的呈现器来将其渲染到屏幕上。
  • 动画效果:WPF中的动画效果也是基于可视化树实现的。我们可以通过在可视化树中定义动画效果,从而实现U元素的平移、缩放、旋转等动态效果。
  • 交互行为:可视化树对鼠标和键盘事件的处理起着重要的作用。当用户与UI元素进行交互时,WPF会自动沿着可视化树向下搜索元素,找到最终被点击或激活的元素,并触发相应的事件。
  • 坐标系统:可视化树提供了WPF中的坐标系统。每个UI元素都有自己的坐标空间,而可视化树提供了一种方便的方式来计算元素之间的相对位置和大小。

VisualTreeHelper类用于执行涉及可视化树中的节点的常规任务,其部分属性如下:

属性说 明
GetChildrenCount( )返回指定可视对象包含的子级个数。
GetChild( )返回指定父可视对象中位于指定集合索引位置的子可视对象。
GetParent( )返回表示视觉对象的父对象的 DependencyObject 值。
HitTest( )通过指定 Point 返回命中测试的最顶层 Visual 对象。
GetContentBounds( )返回指定 Visual 的已缓存的边界框矩形。

ContentRendered方法是在控件(如窗口、页面等)的内容呈现完成后触发的事件,因此在这个方法中调用打印可视化树的代码。

    public partial class MainWindow : Window
    {      
        // 遍历可视化树并打印元素名称
        private void PrintVisualTree(DependencyObject element, string indent = "")
        {
            Console.WriteLine(indent + element.GetType().Name);
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(element, i);
                PrintVisualTree(child, indent + "");
            }
        }
        public MainWindow()
        {
            InitializeComponent();
        }
        
        //在MainWindow.xaml页面,选中Window控件,设置事件ContentRendered
        //内容渲染之后再打印
        private void Window_ContentRendered(object sender, EventArgs e)
        {
            // 访问可视化树结构

            Console.WriteLine("-----------可视化树---------------");
            PrintVisualTree(this);
            Console.WriteLine("----------------------------------");
        }
    }

也可点击生成程序上的按钮"转到实时可视化数树",若显示与打印不符,需按照下图取消勾选。
在这里插入图片描述在这里插入图片描述

总结

  • 尽量不要把自己的Libary放到系统的命名空间中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值