WPF XAML(一)

news2025/1/11 13:59:22

一、XAML的含义

问:XAML的含义是什么?为什么WPF中会使用XAML?而不是别的?

答:在XAML是基于XML的格式,XML的优点在于设计目标是具有逻辑性易读而且简单内容也没有被压缩。  其中需要提一下XAML文件在 Visual Studio (VS) 编译时,是会被转换为BAML。BAML最终会以资源的形式嵌入到DLL或者EXE程序集中。由于BAML是标记化的,所以在程序运行时能够被更快的解析。

二、 XAML文档中的含义 

        我们新建一个WPF应用程序。(创建的过程就跳过了,如果不知道可以查一下)在我们新建的WPF程序中,如下图的红框内容是我们需要介绍的内容。

 放大的效果,我们一行一行的解释:

示例解释:

        首先我们可以关注到两个元素,Window和Grid元素被<>修饰起来的其实都是创建了一个类型的实例。例如<Grid>就是创建了一个Grid对象。其中还需要注意其中Window我们称呼其为“顶级元素”因为在XAML中必须且只能有一个顶级元素。顶级元素在WPF中只有三种类型,其他两种是 Page和Application

 Title="MainWindow" Height="450" Width="800"

 示例解释:

        我们关注到上面的,如Title="MainWindow"  其中这里就是给当前Window 元素对象属性进行了对Title属性赋值,其中赋值是通过attribute特性来实现的。attribute特性可以为每一个类的属性进行赋值。有些情况属性值比较复杂就采用属性元素语法(后面介绍)。

        运行效果是Title 设置当前窗体的标题Width Height是设置当前窗体的宽和高的

<Window x:Class="WpfApp2.MainWindow"

 示例解释:

         这里是指示XAML文件对应的C#类。换句话说就是创建了一个名为MainWindow的新类,改类继承Window

 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

 示例解释:

        这个在WPF当中是指定名称空间的意思,其中以xmlns开头是因为它是xml中的一个特殊特性。它专门用来声明名称空间。所以我们在声明名称空间的时候,通常都是以xmlns开头。

        当前这个名称空间是指向WPF所有的类。

        当前的名称空间是没有前缀的所以它是整个文档的默认名称空间,我们在使用当前名称空间里面的WPF的所有类,我们就不需要以前缀开头来去声明。

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

 示例解释:改名称空间的前缀为X所以在使用当前名称空间的内容前面需要以<X:开头。

举个例子:

 <x:Array Type="List">
     <List>
         <ListItem>
             <Paragraph
                 FontFamily="1"
                 FontSize="15"
                 FontStyle="Normal"
                 FontWeight="Bold">
                 5
             </Paragraph>
         </ListItem>
     </List>
 </x:Array>

三、代码隐藏类

        在我们创建wpf的时候我们前面提到了有一行<Window x:Class="WpfApp2.MainWindow"。是Windows ,X 前缀开头的一个Class来修饰了一个MainWindow类,当前类继承自Windows 。其实这个时候我们的编译器就自动为我们生成了当前类的代码。

代码如下所示:

namespace WpfApp2
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

        我们介绍一下InitializeComponent方法。当前方法就是 调用System.Windows.Application类的LoadComponent方法LoadComponent方法是从程序集中提取BAML并用它来构建用户界面,解析BAML时它会创建每个控件的对象设置其属性并关联所有事件处理程序。所以他在我们wpf当中是很重要的一个方法所以我们永远都不要删除它,就算我们新建了一个构造函数,我们也应该在新建的构造方法当中调用当前方法

四、简单属性和类型转换器

        简单属性?简单属性就是我们前面提到的直接进行对属性进行赋值如  Width="800" ,但我们这里属性赋值的过程中其实编译器会执行类型转换的操作。主要是为了关联非字符串和字符串属性。将转换后的值赋值给我们的属性。首先属性赋值的的过程中都会去查找TypeConverter特性如果提供了TypeConverter特性,该特性将指定哪个类可执行转换。

如Background 属性指定了BrushConverter类型转换器,怎么找到的呢?

 

 提示:类型转换器指定了什么类型的值可以转换为当前属性的值 。 

五、复杂属性

问:什么是复杂属性?

答:实际上就是当前属性包含了完备的对象,当前的对象具有自己的一系列属性。也可以通过类型转换器来实现,但有时可能这种实现方式更加复杂。

举个例子:

<Window.Background>
    <SolidColorBrush Color="Red" />
</Window.Background>

 注意:<Window.Background>标签 我们称呼为WIndow的子标签。

举个例子:

 <Window.Background>
     <LinearGradientBrush>
         <GradientStop Color="Red" Offset="0"  />
         <GradientStop Color="Black" Offset="1"  />
     </LinearGradientBrush>
 </Window.Background>

示例解释:

       当前我们创建了LinearGradientBrush对象然后创建了GradientStop 对象来填充GradientStopCollection集合(LinearGradientBrush 的类型)


提示:所有的xaml我们都说是创建了某某对象然后给某某对象添加了什么样的内容,那么反过来其实我们用xaml写的所有的代码我们都可以用代码来实现 。这里就不做示范了。

六、标记扩展

问:什么是标记扩展?

答:他可以帮我们完成某些情景:如可将属性值设置为一个已经存在的对象、或者希望通过将一个属性绑定到另一个控件来动态的设置属性值。这两种情况我们都需要使用标记扩展。其中我会举例第一种的写法。

举个例子:

 <Window.Background>
     <LinearGradientBrush>
         <LinearGradientBrush.GradientStops>
             <GradientStop Offset="0.5" Color="{x:Static local:MainWindow.color}" />
             <GradientStop Offset="0.5" Color="Black" />
         </LinearGradientBrush.GradientStops>
     </LinearGradientBrush>
 </Window.Background>
using System.Windows;
using System.Windows.Media;

namespace WpfApp2
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        public static Color color { get; set; } = Colors.Red;

    }
}

示例解释: 当前代码将Color属性设置为一个已经存在的对象。

七、嵌套元素

XAML每个元素决定如何处理嵌套的元素。这种交互会使用下面三种机制中的一种进行中转。 

1 如果父元素实现了Ilist接口,解析器将调用list点Add的方法,并且为该方法传入子元素作为参数 

2 如果父元素实现了IDictionary接口那么将调用IDictionary。Add的方法并且为该方法传递子元素作为参数。当使用字典集合时还必须设置X:Key特性以便为每个条目指定键名。

3 父元素使用ContentProperty特性进行修饰,解析器将使用子元素设置对应的属性

举个例子:

 <Window.Background>
     <LinearGradientBrush>
         <LinearGradientBrush.GradientStops>
             <GradientStop Offset="0.5" Color="{x:Static local:MainWindow.color}" />
             <GradientStop Offset="0.5" Color="Black" />
         </LinearGradientBrush.GradientStops>
     </LinearGradientBrush>
 </Window.Background>

示例解释:

        当前属性GradientStops 是GradientStopCollection类型实现了IList接口所以编译器会调用list接口点Add的方法将元素作为参数添加 

举个例子:

 <Grid>
        <Button/>
        <Button/>
</Grid>

示例解释:

        当前Grid既没有实现IDictionary接口也没有实现Ilist接口但他实现了ContentProperty特性所以编译器会执行 。(可以反编译看到)那么实际程序就会调用Grid的Children属性的Add方法将嵌套的元素添加进去。;


提示:所以继承ContentControl控件都只能包含单一的嵌套元素。继承ItemsControl类的控件都可以包含多个条目集合。

举个例子:

<ListBox>
    <ListBoxItem />
    <ListBoxItem />
    <ListBoxItem />
    <ListBoxItem />
    <ListBoxItem />
    <StackPanel />
    <Button />
</ListBox>

<Button>
    <StackPanel />
</Button>

 ListBox继承ItemsControl,而Button继承ContentControl。

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

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

相关文章

WindowsServer安装mysql最新版

安装 下载相应mysql安装包&#xff1a; MySQL :: Download MySQL Installer 选择不登陆下载 双击运行下载好的mysql-installer-community-*.*.*.msi 进入类型选择页面&#xff0c;本人需要mysql云服务就选择了server only server only&#xff08;服务器&#xff09;&#x…

x-cmd pkg | lf - 终端文件管理器

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 lf 是一款功能强大的终端文件管理器&#xff0c;通过快捷键和类似 Vim 的键绑定来完成快速导航和文件操作。 其高度可定制性和扩展功能&#xff0c;可以满足高级用户的需求。 首次用户 使用 x env use lf 即可自动下…

C++ Primer 6.2参数传递 知识点+练习题

C Primer 6.2参数传递 知识点练习题 指针形参使用引用拷贝Const 形参实参尽量使用常量引用数组形参数组引用形参传递多维数组向main函数传参数含有可变形参的函数练习题待更新 指针形参 void reset(int *p) {*p0;//p指向的整型对象变为0p0;//只是对形参改变p&#xff0c;使其为…

【排序】归并排序(C语言实现)

文章目录 1. 递归版的归并排序1.1 归并排序的思想2. 递归版的归并排序的实现 2. 非递归版的归并排序 1. 递归版的归并排序 1.1 归并排序的思想 归并排序&#xff08;MERGE - SORT&#xff09;是建立在归并操作上的一种有效的排序算法, 该算法是采用分治法&#xff08;Divide a…

【Harmony OS - 消息通知】

应用可以通过接口发送通知消息&#xff0c;提醒用户关注应用中的变化。用户可以在通知栏查看和操作通知内容&#xff0c;通常用于当应用处于后台时&#xff0c;发送&#xff0c;本文主要来介绍在Harmony OS中的三种消息通知。 基础通知 总体流程有三步&#xff1a; 导入noti…

Qt 窗口阴影边框

环境&#xff1a;Qt 5.15 VS2019 方法一&#xff1a;QGraphicsDropShadowEffect 实现方法参考链接&#xff1a;https://blog.csdn.net/goforwardtostep/article/details/99549750 使用此方法添加窗口阴影&#xff0c;会出现警告信息&#xff1a; 且窗口最大化与还原切换时会…

facebook广告的基础知识与类型

Facebook广告是在Facebook平台上展示的一种数字广告形式&#xff0c;它允许广告主通过定位特定的受众群体来推广他们的产品、服务或品牌。以下是一些关于Facebook广告的基础知识&#xff1a; 支持Facebook广告的卡、556150、532959&#xff0c;点击获取 广告形式&#xff1a; …

【排序算法】三、选择排序(C/C++)

「前言」文章内容是排序算法之选择排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 选择排序1.1 原理1.2 代码实现&#xff08;C/C&#xff09;1.3 优化1.3 特性总结 选择排…

SpringBoot外部配置文件

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…

232Modbus转Profinet应用案例分享

现场需求&#xff1a;现场需要将多台伺服接到控制器&#xff08;1200PLC&#xff09;上&#xff0c;用Modbus协议。 根据现场的描述&#xff0c;我们给出一个方案&#xff0c;在PLC和伺服中间加入232Modbus转Profinet&#xff08;XD-PNR200&#xff09;网关&#xff0c;232Modb…

【PaperReading】2. MM-VID

Category Content 论文题目 MM-VID: Advancing Video Understanding with GPT-4V(ision) 作者 Kevin Lin, Faisal Ahmed, Linjie Li, Chung-Ching Lin, Ehsan Azarnasab, Zhengyuan Yang, Jianfeng Wang, Lin Liang, Zicheng Liu, Yumao Lu, Ce Liu, Lijuan Wang (Microso…

使用pygame.draw绘制基本图形

import pygame# 初始化pygame pygame.init()# 创建显示窗口 screen pygame.display.set_mode((640, 480)) pygame.display.set_caption("绘制基本图形")# 定义颜色 BLACK (0, 0, 0) WHITE (255, 255, 255) RED (255, 0, 0) GREEN (0, 255, 0) BLUE (0, 0, 255)…

centos7下升级nginx1.8.0版本到nginx1.25.3版本

1、指定目录下载安装包 wget http://nginx.org/download/nginx-1.25.3.tar.gz 2、重命名老版本nginx目录 cd /usr/local/ mv nginx nginx_1.8.0 3、解压更新版本的压缩包 tar -zxvf nginx-1.25.3.tar.gz 4、进入nginx安装包目录下执行如下命令检测系统环境 --with-stream: 添…

【Docker】Docker安装入门教程及基本使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

数据库用户密码修改时间和密码加密值查询(DM8:达梦数据库)

DM8:达梦数据库用户密码加密值查询 环境介绍1 查询达梦数据库密码修改时间与加密值2 查询数据库密码相同的用户3 达梦数据库学习使用列表 环境介绍 要查询用户密码修改时间,用第一个sql;要查询哪些数据库用户密码是一样的,用第二个sql;若忘记达梦数据库用户密码,1 可以试错,2 …

使用 Ant Design Pro 的图表(展示cpu、内存、硬盘)

文章目录 使用 Ant Design Pro 的图表&#xff08;展示cpu、内存、硬盘&#xff09;一、Ant Design Charts 图表二、快速上手三、ant design chart 图表类型StatisticCard 指标卡结合 Ant Design Charts 图表库丰富数值内容&#xff0c;满足大多数数值展示的场景什么是水波图&a…

rime中州韵小狼毫 滤镜与字典的区别

在rime中州韵小狼毫须鼠管输入法中&#xff0c;可以灵活的配置 自定义词典 (rime中州韵小狼毫 自定义词典)和 词组滤镜 (rime中州韵小狼毫 联想词组 滤镜)。而且 自定义词典 和 词组滤镜 看起来效果似乎没有区别。然而&#xff0c;这两者之间的区别&#xff0c;是十分巨大的&am…

Redis学习指南(0)-专栏前言

前言 欢迎来到这个关于Redis的全面教程。Redis&#xff0c;即Remote Dictionary Server&#xff0c;是一款开源的、高性能的内存键值存储系统。它在互联网领域的数据存储和处理中扮演着重要的角色&#xff0c;被广泛应用于缓存、消息队列、实时统计、分布式锁等场景。本专栏将…

ssm框架的简单整合!!!(配置环境)

项目结构&#xff1a; pom.xml: <packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</proj…

jsPlumb、mxGraph和Antv x6实现流程图选型

解决方案 结合我们项目以及主流解决方案&#xff0c;提供以下几种方案&#xff1a; 序号技术栈性质是否开源说明1jsPlumb国外框架社区版、商业版中台项目现有方案2mxGraph国外框架开源比较有名的开源绘图网站draw.io &#xff08;和processOn类似&#xff09;&#xff0c;使用…