XAML 标记扩展

# XAML 标记扩展详解

标记扩展(Markup Extensions)是XAML中一种特殊的语法结构,允许在XAML属性中嵌入动态值或引用,而不是简单的静态值。它们使用花括号`{}`作为标识,是XAML强大功能的核心组成部分。

## 基本语法结构

所有标记扩展都遵循以下基本格式:
```xml
{扩展类 参数1=值1 参数2=值2 ...}
```

```xml
{扩展类 值}  <!-- 当只有一个主要参数时 -->
```

## 核心标记扩展类型

### 1. 资源引用扩展

#### `StaticResource`
- **作用**:引用已定义的资源(编译时确定)
- **示例**:
  ```xml
  <Window.Resources>
      <SolidColorBrush x:Key="MyBrush" Color="Red"/>
  </Window.Resources>
  <Button Background="{StaticResource MyBrush}"/>
  ```
- **特点**:
  - 资源必须在引用之前定义
  - 性能优于DynamicResource

#### `DynamicResource`
- **作用**:动态引用资源(运行时可以更改)
- **示例**:
  ```xml
  <Button Background="{DynamicResource MyBrush}"/>
  ```
- **特点**:
  - 允许运行时更改资源
  - 适用于主题切换等场景
  - 性能开销比StaticResource大

#### `ThemeResource` (UWP/WinUI特有)
- **作用**:根据当前主题自动选择资源
- **示例**:
  ```xml
  <Button Background="{ThemeResource SystemControlBackgroundAccentBrush}"/>
  ```

### 2. 数据绑定扩展

#### `Binding`
- **作用**:建立数据绑定关系
- **基本语法**:
  ```xml
  {Binding Path=PropertyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}
  ```
- **完整示例**:
  ```xml
  <TextBox Text="{Binding Path=UserName, 
                         Mode=TwoWay, 
                         UpdateSourceTrigger=PropertyChanged,
                         ValidatesOnDataErrors=True,
                         Converter={StaticResource MyConverter}}"/>
  ```
- **常用属性**:
  - `Path`:绑定路径(可省略"Path="直接写属性名)
  - `Mode`:`OneWay`, `TwoWay`, `OneTime`, `OneWayToSource`
  - `UpdateSourceTrigger`:`PropertyChanged`, `LostFocus`, `Explicit`
  - `Converter`:值转换器
  - `ElementName`:绑定到其他元素
  - `RelativeSource`:相对绑定源

#### `TemplateBinding`
- **作用**:在控件模板中绑定到模板化父级的属性
- **示例**:
  ```xml
  <ControlTemplate TargetType="Button">
      <Border Background="{TemplateBinding Background}">
          <ContentPresenter/>
      </Border>
  </ControlTemplate>
  ```

### 3. 相对源扩展

#### `RelativeSource`
- **作用**:指定相对于当前元素的绑定源
- **模式**:
  - `Self`:绑定到元素自身
    ```xml
    <Button Content="{Binding RelativeSource={RelativeSource Self}, Path=Width}"/>
    ```
  - `FindAncestor`:查找祖先元素
    ```xml
    <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, 
                             AncestorType={x:Type Window}}, 
                             Path=Title}"/>
    ```
  - `TemplatedParent`:绑定到应用模板的父元素
    ```xml
    <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                             Path=Content}"/>
    ```
  - `PreviousData`:绑定到数据列表中的前一项

### 4. XAML语言级扩展

#### `x:Static`
- **作用**:引用静态属性、字段或枚举值
- **示例**:
  ```xml
  <!-- 引用静态属性 -->
  <Button Content="{x:Static local:MyClass.StaticProperty}"/>
  
  <!-- 引用枚举值 -->
  <Button Visibility="{x:Static Visibility.Collapsed}"/>
  ```

#### `x:Type`
- **作用**:获取类型的Type对象
- **示例**:
  ```xml
  <Style TargetType="{x:Type Button}">
      <Setter Property="FontSize" Value="14"/>
  </Style>
  ```

#### `x:Array`
- **作用**:定义数组
- **示例**:
  ```xml
  <x:Array Type="{x:Type sys:String}" xmlns:sys="clr-namespace:System;assembly=mscorlib">
      <sys:String>Item 1</sys:String>
      <sys:String>Item 2</sys:String>
  </x:Array>
  ```

#### `x:Null`
- **作用**:显式设置为null
- **示例**:
  ```xml
  <Button Background="{x:Null}"/>
  ```

### 5. 自定义标记扩展

您可以创建自己的标记扩展:

```csharp
public class RainbowExtension : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var brush = new LinearGradientBrush();
        // 添加彩虹色渐变
        return brush;
    }
}
```

使用自定义扩展:
```xml
<Button Background="{local:Rainbow}"/>
```

## 标记扩展嵌套

标记扩展可以嵌套使用:

```xml
<Button Content="{Binding Source={StaticResource MyData}, 
                         Path=UserName, 
                         Converter={StaticResource MyConverter}}"/>
```

## 转义花括号

如果需要显示字面量的花括号,可以使用双花括号转义:

```xml
<TextBlock Text="{}{This will display { and }}"/>
<!-- 或 -->
<TextBlock Text="{}{}{This will display { and }}"/>
```

## 标记扩展的工作原理

1. **解析阶段**:XAML解析器遇到`{...}`时,识别为标记扩展
2. **创建实例**:实例化对应的标记扩展类
3. **参数处理**:解析命名参数或位置参数
4. **值提供**:调用`ProvideValue`方法获取实际值
5. **应用值**:将返回值赋给目标属性

## 性能考虑

1. `StaticResource`比`DynamicResource`性能更好
2. 复杂的绑定表达式会增加解析开销
3. 避免在资源键中使用标记扩展(不允许)
4. 考虑在大量重复使用的场景中缓存标记扩展的结果

## 实际应用示例

### 动态主题切换
```xml
<Button Background="{DynamicResource ThemeBrush}"/>
```

### 多级数据绑定
```xml
<TextBlock Text="{Binding Path=Customer.Address.City}"/>
```

### 控件模板中的灵活绑定
```xml
<ControlTemplate TargetType="Button">
    <Border Background="{TemplateBinding Background}">
        <ContentPresenter Content="{TemplateBinding Content}"/>
    </Border>
</ControlTemplate>
```

### 跨元素绑定
```xml
<Slider x:Name="fontSizeSlider" Minimum="8" Maximum="72"/>
<TextBlock FontSize="{Binding ElementName=fontSizeSlider, Path=Value}"/>
```

标记扩展极大地增强了XAML的表达能力,使得UI定义更加灵活和动态,同时保持了声明式编程的简洁性。

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

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

相关文章

DeepSeek+Cursor+Devbox+Sealos项目实战

黑马程序员DeepSeekCursorDevboxSealos带你零代码搞定实战项目开发部署视频教程&#xff0c;基于AI完成项目的设计、开发、测试、联调、部署全流程 原视频地址视频选的项目非常基础&#xff0c;基本就是过了个web开发流程&#xff0c;但我在实际跟着操作时&#xff0c;ai依然会…

Ethan独立开发产品日报 | 2025-04-20

1. Checklist GG 基于人工智能的清单管理工具 checklist.gg是一个基于人工智能的清单管理工具&#xff0c;旨在帮助组织确保每次都能正确完成任务。 关键词&#xff1a;AI驱动, 检查清单, 管理工具, 任务管理, 效率提升, 组织管理, 工作流程, 自动化工具, 清单管理, 协作工具…

第十四届蓝桥杯 2023 C/C++组 冶炼金属

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 蓝桥云课 冶炼金属 洛谷 P92…

【数字图像处理】彩色图像处理(1)

研究彩色图像处理的原因 1&#xff1a;利用颜色信息&#xff0c;可以简化目标物的区分&#xff0c;以及从场景中提取出目标物 2&#xff1a;人眼对颜色非常敏感&#xff0c;可以分辨出来几千种颜色色调和亮度&#xff0c;却只能分别出几十种灰度 彩色图像分类 伪彩色图像处理&…

pytest自动化中关于使用fixture是否影响用例的独立性

第一个问题&#xff1a;难道使用fixture 会影响用例独立吗&#xff1f; ✅ 简单回答&#xff1a; 使用 fixture ≠ 不独立。 只要你的 fixture 是每次测试都能自己运行、自己产生数据的&#xff0c;那么测试用例依然是“逻辑独立”的。 ✅ 怎么判断 fixture 是否影响独立性&a…

C++计算 n! 中末尾零的数量

* 详细说明* 给定一个整数作为输入。目标是找出该数的阶乘结果中末尾零的数量。 一个数 N 的阶乘是范围 [1, N] 内所有数的乘积。* * 我们知道&#xff0c;只有当一个数是 10 的倍数或者有因数对 (2, 5) 时&#xff0c;才会产生末尾零。 在任何大于 5 的数的阶乘中&#xff0c;…

推荐系统/业务,相关知识/概念2

一、漫画库更新大量新作品&#xff0c;如何融入推荐系统&#xff1f; 参考答案&#xff1a; 快速提取新作品特征&#xff1a;除基础属性外&#xff0c;利用自然语言处理技术提取漫画简介关键词等丰富特征向量&#xff0c;分析情节、角色设定等深层次特征结合物品画像体系分类…

# 手写数字识别:使用PyTorch构建MNIST分类器

手写数字识别&#xff1a;使用PyTorch构建MNIST分类器 在这篇文章中&#xff0c;我将引导你通过使用PyTorch框架构建一个简单的神经网络模型&#xff0c;用于识别MNIST数据集中的手写数字。MNIST数据集是一个经典的机器学习数据集&#xff0c;包含了60,000张训练图像和10,000张…

强化学习笔记(三)——表格型方法(蒙特卡洛、时序差分)

强化学习笔记&#xff08;三&#xff09;——表格型方法&#xff08;蒙特卡洛、时序差分&#xff09; 一、马尔可夫决策过程二、Q表格三、免模型预测1. 蒙特卡洛策略评估1) 动态规划方法和蒙特卡洛方法的差异 2. 时序差分2.1 时序差分误差2.2 时序差分方法的推广 3. 自举与采样…

c++_csp-j算法 (4)

迪克斯特拉() 介绍 迪克斯特拉算法(Dijkstra算法)是一种用于解决单源最短路径问题的经典算法,由荷兰计算机科学家艾兹赫尔迪克斯特拉(Edsger W. Dijkstra)于1956年提出。迪克斯特拉算法的基本思想是通过逐步扩展已经找到的最短路径集合,逐步更新节点到源节点的最短路…

(13)VTK C++开发示例 --- 透视变换

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 在VTK&#xff08;Visualization Toolkit&#xff09;中&#xff0c;vtkPerspectiveTransform 和 vtkTransform 都是…

深入探索Qt异步编程--从信号槽到Future

概述 在现代软件开发中,应用程序的响应速度和用户体验是至关重要的。尤其是在图形用户界面(GUI)应用中,长时间运行的任务如果直接在主线程执行会导致界面冻结,严重影响用户体验。 Qt提供了一系列工具和技术来帮助开发者实现异步编程,从而避免这些问题。本文将深入探讨Qt…

基于Python的图片/签名转CAD小工具开发方案

基于Python的图片/签名转CAD工具开发方案 一、项目背景 传统设计流程中&#xff0c;设计师常常需要将手写签名或扫描图纸转换为CAD格式。本文介绍如何利用Python快速开发图像矢量化工具&#xff0c;实现&#xff1a; &#x1f4f7; 图像自动预处理✏️ 轮廓精确提取⚙️ 参数…

【仓颉 + 鸿蒙 + AI Agent】CangjieMagic框架(17):PlanReactExecutor

CangjieMagic框架&#xff1a;使用华为仓颉编程语言编写&#xff0c;专门用于开发AI Agent&#xff0c;支持鸿蒙、Windows、macOS、Linux等系统。 这篇文章剖析一下 CangjieMagic 框架中的 PlanReactExecutor。 1 PlanReactExecutor的工作原理 #mermaid-svg-OqJUCSoxZkzylbDY…

一文了解相位阵列天线中的真时延

本文要点 真时延是宽带带相位阵列天线的关键元素之一。 真时延透过在整个信号频谱上应用可变相移来消除波束斜视现象。 在相位阵列中使用时延单元或电路板&#xff0c;以提供波束控制和相移。 市场越来越需要更快、更可靠的通讯网络&#xff0c;而宽带通信系统正在努力满…

Java中 关于编译(Compilation)、类加载(Class Loading) 和 运行(Execution)的详细区别解析

以下是Java中 编译&#xff08;Compilation&#xff09;、类加载&#xff08;Class Loading&#xff09; 和 运行&#xff08;Execution&#xff09; 的详细区别解析&#xff1a; 1. 编译&#xff08;Compilation&#xff09; 定义 将Java源代码&#xff08;.java文件&#x…

【KWDB 创作者计划】_深度学习篇---松科AI加速棒

文章目录 前言一、简介二、安装与配置硬件连接驱动安装软件环境配置三、使用步骤初始化设备调用SDK接口检测设备状态:集成到AI项目四、注意事项兼容性散热固件更新安全移除五、硬件架构与技术规格核心芯片专用AI处理器内存配置接口类型物理接口虚拟接口能效比散热设计六、软件…

如何清理Windows系统中已失效或已删除应用的默认打开方式设置

在使用Windows系统的过程中&#xff0c;我们可能会遇到一些问题&#xff1a;某些已卸载或失效的应用程序仍然出现在默认打开方式的列表中&#xff0c;这不仅显得杂乱&#xff0c;还可能影响我们快速找到正确的程序来打开文件。 如图&#xff0c;显示应用已经被geek强制删除&am…

NFC碰一碰发视频推广工具开发注意事项丨支持OEM搭建

随着线下门店短视频推广需求的爆发&#xff0c;基于NFC技术的“碰一碰发视频”推广工具成为商业热点。集星引擎在开发同类系统时&#xff0c;总结出六大核心开发注意事项&#xff0c;帮助技术团队与品牌方少走弯路&#xff0c;打造真正贴合商户需求的实用型工具&#xff1a; 一…

pgsql中使用jsonb的mybatis-plus和Spring Data JPA的配置

在pgsql中使用jsonb类型的数据时&#xff0c;实体对象要对其进行一些相关的配置&#xff0c;而mybatis和jpa中使用各不相同。 在项目中经常会结合 MyBatis-Plus 和 JPA 进行开发&#xff0c;MyBatis_plus对于操作数据更灵活&#xff0c;jpa可以自动建表&#xff0c;两者各取其…