共用方式為


標記延伸和 XAML

更新:2007 年 11 月

本主題介紹可延伸標記語言 (XAML) 標記延伸的概念,包括其語法規則、目的以及物件模型基礎。

這個主題包含下列章節。

  • XAML 處理器和標記延伸
  • 基本標記延伸語法
  • WPF 專用標記延伸
  • XAML 定義標記延伸
  • 進一步了解標記延伸語法
  • 相關主題

XAML 處理器和標記延伸

XAML 處理器的定義為依據其規格,可以接受 XAML 做為語言 (透過編譯或解譯),且可以產生供執行階段物件模型使用之基礎類別結果 (亦根據 XAML 規格) 的任何程式。根據預設,這類處理器會根據屬性 (Attribute) 的型別,或該屬性專用的型別轉換子 (Type Converter),將屬性值解譯成常值字串,或是將它轉換成物件。不過,少數案例需要不同的行為。例如,您可以指示 XAML 處理器,指出屬性的值應該是已經建構的物件或靜態物件的參考。或者,您也可以指示 XAML 處理器使用為物件之建構函式提供非預設引數的語法。這是預設指定 XAML 處理器行為的變異版本。

基本標記延伸語法

實作標記延伸可以為屬性 (Attribute) 使用方式中的屬性 (Property)、屬性 (Property) 項目使用方式中的屬性 (Property) 或兩者提供值。

當用來提供屬性值時,可以用是否有左右大括號 ({ 和 }) 的語法,區分 XAML 處理器的標記延伸。標記延伸的型別則是由緊接在右側大括號後面的字串語彙基元 (Token)。

屬性項目語法中使用的標記延伸,在視覺上與用來提供屬性項目值的其他任何項目相同:參考標記延伸類別做為項目的 XAML 項目宣告,前後以角括弧 (<>) 括住。

WPF 專用標記延伸

WPF 程式設計中最常見的標記延伸是支援資源參考 (StaticResource 和 DynamicResource),以及支援資料繫結 (Data Binding) (Binding) 的標記延伸。

StaticResource 會透過取代已經定義之資源的值,提供 XAML 屬性的值。如需詳細資訊,請參閱 StaticResource 標記延伸

DynamicResource 提供 XAML 屬性值的方式是將該值延後,使其變成資源的執行階段參考。動態資源參考可在每次存取這類資源時,強制執行新的查詢作業。如需詳細資訊,請參閱 DynamicResource 標記延伸

Binding 會依據適用於項目的資料內容,提供屬性的資料繫結值。這個標記延伸相當複雜,因為它會啟用用來指定資料繫結的基本內嵌語法。如需詳細資訊,請參閱繫結標記延伸

RelativeSource 提供 Binding 的來源資訊,此 Binding 可以巡覽執行階段項目樹狀結構中數種可能的關聯性。如此即使未能完全了解周圍的項目樹狀結構,也可以針對在多次使用樣板中建立的繫結,或是在程式碼中建立的繫結,提供特製化來源。如需詳細資訊,請參閱 RelativeSource 標記延伸

TemplateBinding 可讓控制項樣板使用樣板化屬性的值,而這些樣板化屬性是來自將要使用此樣板之類別的物件模型定義屬性。如需詳細資訊,請參閱 TemplateBinding 標記延伸。如需 TemplateBinding 實際用途的詳細資訊,請參閱使用 ControlTemplates 設定樣式範例

XAML 定義標記延伸

有幾個標記延伸不是 XAML 的 WPF 應用程式專用的標記延伸,而是 XAML 語言規格的一部分。這些標記延伸通常可透過一般常見語法中的 x: 前置字元加以識別,這些語言項目的 WPF 實作使用同樣的 MarkupExtension 基底類別提供實作。

注意事項:

x: 前置字元用於 XAML 應用程式或文件之根項目 (Root Element) 中,XAML 命名空間的一般 XML 命名空間對應。例如 Microsoft Visual Studio 2005 樣板便會使用這種 x: 對應啟始 XAML 檔案。您可以在自己的 XML 命名空間對應中選擇不同的前置字元語彙基元,但是本文件將採用預設 x: 對應做為工具,識別 XAML 命名空間 (相對於 WPF 命名空間或其他任意 CLR 或 XML 命名空間) 之定義部分的實體 (Entity)。

x:Type 會提供具名型別的 Type 物件。這是樣式和樣板中最常使用的標記延伸。如需詳細資訊,請參閱 x:Type 標記延伸

x:Static 會從實值型別程式碼實體產生靜態值,而這些實體本身不是屬性值型別,但卻可評估為該型別。如需詳細資訊,請參閱 x:Static 標記延伸

x:Null 指定 null 做為 XAML 屬性的值。如需詳細資訊,請參閱 x:Null 標記延伸

在刻意不使用基底項目和控制項模型提供的集合支援時,x:Array 提供使用 XAML 語法建立一般陣列的支援。如需詳細資訊,請參閱 x:Array 標記延伸

進一步了解標記延伸語法

*Extension 類別

每個標記延伸項目都是透過衍生自 MarkupExtension 的 *Extension 類別向 XAML 處理器識別其行為,並提供 ProvideValue 方法的實作。各個延伸項目上的這個方法都會定義在完成標記延伸的評估之後,立即傳回的物件。傳回的物件通常都是使用傳遞至標記延伸的各種字串語彙基元來加以具現化或設定。

例如,StaticResourceExtension 類別可提供實際資源查詢的介面實作,使其 ProvideValue 實作能夠使用該特定實作的輸入做為依據其 x:Key 查詢資源的字串,以傳回要求的物件。如果您使用的是現有的標記延伸,這項實作詳細資料大多無關緊要。

後接字串語彙基元的延伸類別解譯

XAML 處理器會使用下列其中一種方法,解譯位於標記延伸識別項後面且在括號內的字串語彙基元:

  • 逗號一律代表個別語彙基元的分隔字元或分隔符號 (Delimiter)。因此,常值逗號不能傳遞至標記延伸。

  • 如果個別的分隔語彙基元沒有包含任何等號,每個語彙基元都會被視為建構函式引數。每個建構函式參數都必須依照該簽章所預期的適當順序,以該簽章預期的型別來提供。

    注意事項:

    XAML 處理器必須呼叫符合成對數目之引數計數的建構函式。因此,如果您實作的是自訂標記延伸,請勿提供引數數目相同的多個參數;目前並未定義有一個以上標記延伸建構函式具有相同的參數數目時,所將出現的行為。

  • 如果個別的分隔語彙基元包含等號,則 XAML 處理器會先呼叫標記延伸的預設建構函式,接著再將每個 name=value 的配對解譯成存在於標記延伸中的屬性名稱,以及要指派給該屬性的值。

  • 如果標記延伸中的建構函式行為和屬性設定行為之間有對等的結果,則不論您使用哪種行為都沒有關係。比較常見的用法是將 property=value 配對用於具有一個以上可設定屬性的標記延伸,唯一的原因是它可讓您的標記更符合目的,而且不慎調換建構函式參數的可能性也較低 (當您指定 property=value 配對時,這些屬性可以是任何順序)。此外,標記延伸也不一定會提供用來設定每個可設定屬性的建構函式參數。例如,Binding 是延伸標記,其具有許多可透過 property=value 格式的延伸項目來設定的屬性,但是 Binding 只支援兩個建構函式:預設建構函式和用來設定初始路徑的建構函式。

逸出常值大括號

XAML 處理器中的屬性處理使用大括號做為標記延伸的指標。如果必要,也可以使用一組空白大括號後接常值大括號來輸入逸出序列 (Escape Sequence),以便產生常值大括號字元屬性值。請參閱 {} 逸出序列 / 標記延伸

巢狀延伸語法

此系統支援多重標記延伸的巢狀結構,而且每個標記延伸都會先進行最深層的評估,例如:

<Setter Property="Background"

Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />

進一步了解標記延伸和屬性項目語法

標記延伸類別當做用來填入屬性項目值的物件項目使用時,在視覺上與可用於 XAML 之中的一般項目並無任何分別。在這種情況下,一般項目和標記延伸之間的實際差異在於,標記延伸會評估為型別值或延後為運算式,因此任何可能的屬性值型別錯誤所用的機制都不同,就像其他程式設計模型中處理晚期繫結屬性的方式一樣。一般項目則會針對型別以及編譯後立即設定的屬性進行評估。

在物件項目語法中用來填入屬性項目的標記延伸大部分都沒有內容或其他任何內含的屬性項目語法,因此您會關閉物件項目標記,而且不會提供任何子項目。每當 XAML 處理器遇到任何物件項目時,都會呼叫該類別的建構函式,以具現化從剖析項目建立的物件。標記延伸類別也一樣;因此,如果您想要在物件項目語法中使用自己的標記延伸,則必須提供預設建構函式。某些現有的標記延伸會有至少一個必要屬性 (Property) 值,您必須指定這個屬性值才能有效進行初始設定;如果是這種情況,該屬性值通常會指定成物件項目上的 Property 屬性 (Attribute)。在 XAML 命名空間 (x:) 語言功能WPF 命名空間 XAML 擴充參考頁面上,都會特別註明具有必要屬性 (以及必要屬性之名稱) 的標記延伸。參考頁面也會註明特定標記延伸是否不允許物件項目語法或屬性語法。其中一個值得注意的案例是 x:Array 標記延伸,這種標記延伷無法支援屬性語法,因為它必須指定該陣列的內容。陣列內容的處理方式與一般物件相同,因此無法使用屬性的任何預設型別轉換子。此外,x:Array 標記延伸也需要 Type 參數。

請參閱

概念

XAML 概觀

參考

StaticResource 標記延伸

繫結標記延伸

DynamicResource 標記延伸

x:Type 標記延伸

其他資源

XAML 命名空間 (x:) 語言功能

WPF 命名空間 XAML 擴充