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.pswp.cn/news/902321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902321.shtml
英文地址,請注明出處:http://en.pswp.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;兩者各取其…