当前位置: 首页 > news >正文

【WPF系列】- XAML语法规范

【WPF系列】- XAML语法规范

文章目录

  • 【WPF系列】- XAML语法规范
    • 一、概述
    • 二、对象元素语法
    • 三、特性语法(属性)
    • 四、特性值的处理
    • 五、枚举特性值
    • 六、属性和事件成员名称引用
    • 七、属性元素语法
    • 八、集合语法
    • 九、XAML 内容属性
      • XAML 内容属性值必须是连续的
    • 十、内容属性和集合语法组合
    • 十一、总结

一、概述

定义XAML语法术语是XAML语言规范中进行定义或引用。XAML是基于XML的语言,遵循或扩展XML结构规则。XAML是基于描述XML语言或XML文档对象模型时常用的术语。

XAML是一种标记语言。CLR是可实现运行时语言。XAML不是CRL运行一部分。仅是使用于WPF的XAML时实例化运行的一种表达形式。

二、对象元素语法

对象元素语法是 XAML 标记语法,通过声明 XML 元素来实例化 CLR 类或结构。 此语法类似于其他标记语言(如 HTML)的元素语法。 对象元素语法以左尖括号 (<) 开头,后面紧跟进行实例化的类或结构的类型名称。 零个或多个空格可以跟在类型名称后面,零个或多个属性也可以在对象元素上声明,使用一个或多个空格分隔每个属性名称=“值”对。对象元素必须满足一下条件之一:

  • 元素和标记必须以正斜杠 (/) 结尾,后面紧跟右尖括号 (>)。
  • 开始标记必须以右尖括号 (>) 结尾。 其他对象元素、属性元素或内部文本可以跟在开始标记后面。 此处可能包含的确切内容通常受元素的对象模型约束。 对象元素的等效结束标记也必须存在,与其他开始和结束标记对进行正确的嵌套和平衡。

实例一:

<TextBox Text="TextBox"  Width="120"/>

实例二:

<TextBox Text="TextBox"  Width="120"></TextBox>

三、特性语法(属性)

特性语法是 XAML 标记语法,它通过对现有对象元素声明特性来设置属性的值。 特性名称必须与支持相关对象元素的类的属性的 CLR 成员名称匹配。 特性名称后跟赋值运算符 (=)。 特性值必须是括在引号中的字符串。

若要通过特性语法进行设置,属性必须是公共属性,并且必须可写。 后备类型系统中属性的值必须是值类型,或者必须是在访问相关后备类型时可由 XAML 处理器实例化或引用的引用类型。

对于 WPF XAML 事件,作为特性名称引用的事件必须是公共的,并且具有公共委托。

四、特性值的处理

左和右引号中包含的字符串值由 XAML 处理器进行处理。 对于属性,默认处理行为由基础 CLR 属性的类型确定。

特性值会按此处理顺序,使用以下内容之一进行填充:

  1. 如果XAML处理器遇到大括号或派生自MarkupExtension的对象元素,则首先计算引用的标记扩展,而不是将值作为字符串进行处理,标记扩展返回的对象会用作值。 在许多情况下,标记扩展返回的对象会是对现有对象的引用,或者是将计算延迟到运行时的表达式,不是新实例化的对象。
  2. 如果使用特性化TypeConverter声明属性,或者使用特性化TypeConverter声明该属性的值类型,则特性的字符串值会作为转换输入提交到类型转换器,转换器会返回新的对象实例。
  3. 如果没有TypeConverter,则尝试直接转换为属性类型。此最终在 XAML 语言基元类型之间对分析器本机值进行直接转换,或者检查枚举中命名常量的名称(分析器随后会访问匹配值)。

五、枚举特性值

XAML 中的枚举由 XAML 分析器以内部方式进行处理,枚举的成员应通过指定枚举命名常量之一的字符串名称来指定。对于非标志枚举值,本机行为是处理特性值的字符串并将它解析为枚举值之一。无需如同在代码中一样,以“枚举.值”格式指定枚举。 而是仅指定值,枚举通过所设置的属性类型进行推断。 如果以“枚举.值”形式指定特性,则不会正确进行解析。

对于按标志枚举,行为基于 Enum.Parse方法。 可以通过用逗号分隔每个值,为按标志枚举指定多个值。 但是,不能合并不按标志的枚举值。

六、属性和事件成员名称引用

指定属性时,可以引用以针对包含对象元素实例化的 CLR 类型的成员形式而存在的任何属性或事件。或者可以引用独立于包含对象元素的附加属性或附件事件。

使用 typeName.event 部分限定名称对可通过默认命名空间访问的任何对象中的任何事件进行命名;此语法支持为路由事件附加处理程序,其中处理程序旨在处理从子元素路由的事件,但父元素在其成员表中也不包含该事件。 此语法类似于附加事件语法,但此处的事件不是真正的附加事件。 而是使用限定名称引用事件。

七、属性元素语法

属性元素语法是一种与元素的基本 XML 语法规则有一些差异的语法。 在 XML 中,特性的值是事实上的字符串,唯一可能的变化是所使用的字符串编码格式。 在 XAML 中,可以分配其他对象元素作为属性的值。 属性元素语法在默认情况下会启用此功能。 属性不是在元素标记中指定为特性,而是采用 elementTypeName.propertyName 形式,使用开始元素标记进行指定,在其中指定属性的值,然后结束属性元素。具体而言,语法以左尖括号 (<) 开头,后面紧跟属性元素语法包含在其中的类或结构的类型名称。 紧接着是单个点 (.),然后是属性的名称,再然后是右尖括号 (>)。 与特性语法一样,该属性必须存在于指定类型的已声明公共成员中。

属性元素语法实例:

<Button><Button.ContextMenu><ContextMenu><MenuItem Header="1">First item</MenuItem><MenuItem Header="2">Second item</MenuItem></ContextMenu></Button.ContextMenu>Right-click me!
</Button>

八、集合语法

XAML 规范要求 XAML 处理器实现标识值类型为集合的属性。 .NET 中的常规 XAML 处理器实现基于托管代码和 CLR,它通过下列方法之一标识集合类型:

  • 类型实现IList
  • 类型实现IDictionary
  • 类型派生自Array

如果属性的类型是集合,则推断的集合类型不需要在标记中指定为对象元素。 相反,旨在成为集合中的项的元素被指定为属性元素的一个或多个子元素。

<Style x:Key="SpecialButton" TargetType="{x:Type Button}"><Style.Triggers><Trigger Property="Button.IsMouseOver" Value="true"><Setter Property = "Background" Value="Red"/></Trigger><Trigger Property="Button.IsPressed" Value="true"><Setter Property = "Foreground" Value="Green"/></Trigger></Style.Triggers>
</Style>

九、XAML 内容属性

XAML 内容语法是一种仅在指定 ContentPropertyAttribute 作为类声明一部分的类上启用的语法。 ContentPropertyAttribute会引用作为该类型元素(包括派生类)的内容属性的属性名称。 由 XAML 处理器进行处理时,在对象元素的开始标记与结束标记之间找到的任何子元素或内部文本都会分配给该对象的 XAML 内容属性值。 允许为内容属性指定显式属性元素,但此用法通常不会出现在 .NET 参考的 XAML 语法部分中。 显式/详细技术偶尔对使标记清晰或是在标记样式方面有价值,但内容属性的意图通常是简化标记,以便可以直接嵌套直观上以父子形式相关的元素。 按照严格的 XAML 语言定义,元素上其他属性的属性元素标记不会分配为“内容”;它们以前按 XAML 分析器的处理顺序进行处理,不被视为“内容”。

  • XAML 内容属性值必须是连续的

AML 内容属性的值必须完全在该对象元素的其他任何属性元素之前或之后指定。 无论 XAML 内容属性的值是指定为字符串还是一个或多个对象,情况都是如此。 例如,以下标记不会进行分析:

<Button Margin="67,45,202,245"><Button.Background>Blue</Button.Background><Button.FontSize>Bold</Button.FontSize><Button.Foreground>#FFFFF5F5</Button.Foreground><Button.Content>这是一个有背景的按钮</Button.Content>
</Button>

十、内容属性和集合语法组合

若要接受多个对象元素作为内容,内容属性的类型必须明确为集合类型。 与集合类型的属性元素语法类似,XAML 处理器必须标识属于集合类型的类型。 如果元素具有 XAML 内容属性,并且 XAML 内容属性的类型是集合,则隐式集合类型不需要在标记中指定为对象元素,并且 XAML 内容属性不需要指定为属性元素。 因此,标记中的明显内容模型现在可以将多个子元素分配为内容。

<Window x:Class="_010_WPF_Demo.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"xmlns:local="clr-namespace:_010_WPF_Demo"mc:Ignorable="d"Title="MainWindow" Height="450" Width="900"><Grid ><StackPanel Width="100" Height="200"><Button>Button 1</Button><Button>Button 2</Button><Button>Button 3</Button></StackPanel></Grid>
</Window>

十一、总结

XAML语法规范大致有以上几种常用的方式,在实际应用中会根据不同的场景,选择恰当的方式组合完成应用程序的开发。

相关文章:

【WPF系列】- XAML语法规范

【WPF系列】- XAML语法规范 文章目录 【WPF系列】- XAML语法规范一、概述二、对象元素语法三、特性语法&#xff08;属性&#xff09;四、特性值的处理五、枚举特性值六、属性和事件成员名称引用七、属性元素语法八、集合语法九、XAML 内容属性XAML 内容属性值必须是连续的 十、…...

antv/g6之图布局及切换布局

一般图布局 目前为止&#xff0c;g6的一般图布局已经有13种了&#xff0c;如下: Random Layout&#xff1a;随机布局&#xff1b;Force2 Layout&#xff1a;G6 4.7.0 后支持力导向布局&#xff0c;与 gForce 相比性能更强&#xff1b;GForce Layout&#xff1a;G6 4.0 支持的…...

Wordpress plugin removes ‘/category‘

plugin removes /category from your category permalinks Remove Category URL – WordPress plugin | WordPress.org...

【大数据基础平台】星环TDH社区集群版本部署

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f…...

【Java】汉诺塔

汉诺塔 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff08;河内塔&#xff09;&#xff1a;把圆盘从下面开始按大小顺序重新摆放到另一根柱子上&#xff0c;并且小圆盘上不能放大圆盘&#xff0c;在三根柱子之间一次只能移动一个圆盘。 汉诺塔规则 disk表示圆盘数一次只…...

Java实现对Html文本的处理

1.引入jsoup <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.8.3</version> </dependency> 2. html示例 示例代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1…...

Vue项目创建与启动(2023超详细的图文教程)

目录 一、下载node.js 二、下载vue-cli与webpack插件 三、项目初始化(项目配置详细信息) 四、项目启动 五、Vue项目工程结构&#xff08;扩展知识&#xff09; 一、下载node.js 1.检测是否已经安装过node.js 打开控制台,输入 npm -v如果有会显示对应版本 如果没有会显示…...

EtherCAT主站读取从站EEPROM抓包分析

0 工具准备 1.EtherCAT主站 2.EtherCAT从站&#xff08;本文使用步进电机驱动器&#xff09; 3.Wireshark1 抓包分析 1.1 报文总览 本文让主站去读取从站1字地址为0的EEPROM数据内容&#xff0c;主站读取从站EEPROM数据内容使用Wireshark抓包如下&#xff1a; 1.2 EEPROM读…...

Elasticsearch 8.X 如何生成 TB 级的测试数据 ?

1、实战问题 我只想插入大量的测试数据&#xff0c;不是想测试性能&#xff0c;有没有自动办法生成TB级别的测试数据&#xff1f;有工具&#xff1f;还是说有测试数据集之类的东西&#xff1f;——问题来源于 Elasticsearch 中文社区https://elasticsearch.cn/question/13129 2…...

汽车标定技术(四)--问题分析:多周期测量时上位机显示异常

目录 1.问题现象 2.数据流分析 ​​​​3.代码分析 3.1 AllocDAQ 3.2 AllocOdt 3.3 AllocOdtEntry 4.根因分析及解决方法 4.1 根因分析 4.2 解决方案 1.问题现象 在手撸XCP代码时&#xff0c; DAQ的实现是一大头痛的事情。最初单周期实现还好一点&#xff0c;特别是…...

Flink SQL时间属性和窗口介绍

&#xff08;1&#xff09;概述 时间属性&#xff08;time attributes&#xff09;&#xff0c;其实就是每个表模式结构&#xff08;schema&#xff09;的一部分。它可以在创建表的 DDL 里直接定义为一个字段&#xff0c;也可以在 DataStream 转换成表时定义。 一旦定义了时间…...

Tomcat免安装版修改标题名称和进程

tomcat免安装版启动后闪退问题 问题描述 在官网下载的tomcat免安装版的你安装完环境后发现启动闪退&#xff0c;tomcat启动依赖环境是JDK&#xff0c;所以需要tomcat对应版本的JDK支持。 tomcat8官网下载地址&#xff1a;https://tomcat.apache.org/ JDK环境官网下载地址&…...

vim搜索、替换tab

bibtex 中的缩进可能不一致&#xff0c;强迫症犯了想将&#xff1a; 缩进空格改 tab&#xff1b;行首的多个 tab 改为单个 参考 [1]&#xff0c;空格换 tab 可以&#xff1a; :set noexpandtab :%retab!行首的多个 tab 换单个&#xff1a; :%s/^\t\/\t/gReferences Replac…...

一文读懂ARM安全性架构和可信系统构建要素

一文读懂ARM安全性架构和可信系统构建要素 所谓可信系统&#xff08;trusted system&#xff09;&#xff0c;即能够用于保护密码和加密密钥等资产&#xff08;assets&#xff09;免受一系列的可信攻击&#xff0c;防止其被复制、损坏或不可用&#xff08;unavailable&#xf…...

Voice vlan、ICMP、单臂路由、mux-vlan

目录 一&#xff0c;Voice VLAN Voice vlan配置命令 一&#xff0c;问&#xff1a;已知网络中一台服务器的IP地址&#xff0c;如何找到这太服务器在哪台交换机的哪个接口上​编辑 思路&#xff1a; 二&#xff0c;ICMP协议 三&#xff0c;ICMP案例分析​编辑 四&#xf…...

TCP IP 网络编程(七) 理解select和epoll的使用

文章目录 理解select函数select函数的功能和调用顺序设置文件描述符设置监视范围及超时select函数调用示例 优于select的epoll基于select的I/O复用速度慢实现epoll时必要的函数和结构体epoll_createepoll_ctlepoll_wait基于epoll的服务器端 边缘触发和水平触发 理解select函数 …...

Linux accept和FD_xxx的使用

Linux socket accept功能的作用是在服务器端等待并接受客户端的连接请求。当有客户端尝试连接服务器时&#xff0c;服务器调用accept函数来接受该连接请求&#xff0c;并创建一个新的socket来与该客户端进行通信。 具体来说&#xff0c;accept函数被动监听客户端的三次握手连接…...

树结构及其算法-二叉运算树

目录 树结构及其算法-二叉运算树 C代码 树结构及其算法-二叉运算树 二叉树的应用实际上相当广泛&#xff0c;例如表达式之间的转换。可以把中序表达式按运算符优先级的顺序建成一棵二叉运算树&#xff08;Binary Expression Tree&#xff0c;或称为二叉表达式树&#xff09;…...

vue的rules验证失效,部分可以部分又失效的原因

vue的rules验证失效,部分可以部分又失效的原因 很多百度都有,但是我这里遇到了一个特别的,那就是prop没有写全,导致验证某一个失效 例子: 正常写法 el-form-item....多个省略<el-form-item label"胶币" prop"cost"><el-input v-model"form.…...

c#字符串转整数类型

将字符串转换为整数类型。为了方便&#xff0c;C#提供了一个内置的方法TryParse来实现这个功能 字符串&#xff08;String&#xff09;&#xff1a;表示一串字符的数据类型。整数&#xff08;Integer&#xff09;&#xff1a;表示不带小数点的数字。解析&#xff08;Parsing&a…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...