XAML 語法詳細資料

本主題會定義用來描述 XAML 語法元素的詞彙。 本檔的其餘部分會經常使用這些詞彙,也就是針對 WPF 檔,以及使用 XAML 的其他架構或在 .xaml 層級支援 XAML 語言的基本 XAML 概念。 本主題將針對 WPF 中的 XAML主題所引進的基本術語進行擴充。

本主題會定義用來描述 XAML 語法元素的詞彙。 本檔的其餘部分會經常使用這些詞彙,也就是針對 WPF 檔,以及使用 XAML 的其他架構或在 .xaml 層級支援 XAML 語言的基本 XAML 概念。 本主題將擴展 XAML 總覽 (WPF) 中所介紹的基本術語。

XAML 語言規格

此處定義的 XAML 語法術語也會在 XAML 語言規格內定義或參考。 XAML 是以 XML 為基礎的語言,並遵循或展開 XML 結構化規則。 部分術語的共用來源,也是根據描述 XML 語言或 XML 檔物件模型時常用的術語。

如需 XAML 語言規格的詳細資訊,請從 Microsoft 下載中心下載 [ MS XAML ]

XAML 和 CLR

XAML 是標記語言。 Common language runtime (CLR) ,如其名稱所暗示,可啟用執行時間執行。 XAML 並非由 CLR 執行時間直接取用的其中一種通用語言所組成。 相反地,您可以將 XAML 視為支援它自己的型別系統。 WPF 所使用的特定 XAML 剖析系統是以 CLR 和 CLR 型別系統為基礎。 XAML 型別會對應至 CLR 類型,以在剖析 WPF 的 XAML 時具現化運行時程表示法。 基於這個理由,本檔中的語法討論的其餘部分將包含對 CLR 型別系統的參考,即使 XAML 語言規格中的對等語法討論也不是一樣。 根據 XAML 語言規格層級 (,XAML 型別可以對應至任何其他類型系統,這不一定是 CLR,但需要建立和使用不同的 XAML 剖析器。 )

類型和類別繼承的成員

當屬性和事件顯示為類型的 XAML 成員時, WPF 通常會繼承自基底類型。 例如,請考慮下列範例: <Button Background="Blue" .../>Background Button 如果您要查看類別定義、反映結果或檔,屬性不是類別上的立即宣告屬性。 相反地, Background 會繼承自基類 Control

XAML 專案的類別繼承行為 WPF 是從 XML 標記的架構強制轉譯中大幅離開。 類別繼承可能會變得很複雜,特別是當中繼基類為抽象或涉及介面時。 這是因為 XAML 專案和其所允許屬性集很難精確地呈現,且使用通常用於 XML 程式設計的架構類型(例如 DTD 或 XSD 格式)的原因之一。 另一個原因是 XAML 語言本身的擴充性和類型對應功能,會排除所允許類型和成員之任何固定標記法的完整性。

物件元素語法

物件元素語法 是 XAML 標記語法,可透過宣告 XML 專案來具現化 CLR 類別或結構。 這個語法類似于其他標記語言(例如 HTML)的元素語法。 物件元素語法的開頭是左角括弧 (<) ,後面緊接著要具現化之類別或結構的型別名稱。 零個或多個空格可接在類型名稱後面,而且也可以在物件專案上宣告零或多個屬性,並以一或多個空格分隔每個屬性名稱 = "value" 配對。 最後,必須符合下列其中一項條件:

  • 元素和標記必須以正斜線封閉 (/) 後面緊接著右角括弧 (>) 。

  • 開頭標記必須以右角括弧 (>) 完成。 其他物件元素、屬性元素或內部文字可以接在開頭標記之後。 這裡所包含的內容,通常會受到專案的物件模型所限制。 物件元素的對等結束記號也必須存在,且與其他開頭和結束記號組有適當的嵌套和平衡。

.NET 所執行的 XAML 具有一組規則,可將物件專案對應至類型、屬性或事件,以及將 XAML 命名空間對應至 CLR 命名空間和元件。 針對 WPF 和 .NET,XAML 物件專案會對應至 .NET 類型,如參考的元件中所定義,而這些屬性會對應至這些類型的成員。 當您在 XAML 中參考 CLR 類型時,也可以存取該類型的繼承成員。

例如,下列範例是將類別的新實例具現化的物件專案語法 Button ,同時也會指定 Name 屬性和該屬性的值:

<Button Name="CheckoutButton"/>

下列範例是物件元素語法,其中也包含 XAML 內容屬性語法。 內所含的內部文字將用來設定 TextBox XAML 內容屬性 Text

<TextBox>This is a Text Box</TextBox>

內容模型

類別可能會以語法的形式支援使用方式做為 XAML 物件專案,但該專案在放置於整體內容模型或元素樹狀結構的預期位置時,才會在應用程式或頁面中正確運作。 例如, MenuItem 通常應該只將放置為衍生類別的子系, MenuBase 例如 Menu 。 特定專案的內容模型會記載為控制項的類別頁面上的備註一部分,以及可當做 WPF XAML 專案使用的其他類別。

物件元素的屬性

XAML 中的屬性是透過各種可能的語法來設定。 根據您要設定之屬性的基礎類型系統特性而定,特定屬性可以使用哪種語法會有所不同。

藉由設定屬性的值,您可以將特徵或特性新增至物件,因為它們存在於執行時間物件圖形中。 從 object 元素建立之物件的初始狀態是以無參數的函式行為為基礎。 一般來說,您的應用程式將會使用任何指定物件的完全預設實例以外的其他內容。

屬性 (Attribute) 語法 (屬性(Property))

屬性語法是 XAML 標記語法,可在現有物件專案上宣告屬性來設定屬性的值。 屬性名稱必須符合支援相關物件專案之類別屬性的 CLR 成員名稱。 屬性名稱後面接著指派運算子 (=) 。 屬性值必須是括在引號內的字串。

注意

您可以使用替代引號,將常值引號放在屬性中。 比方說,您可以使用單引號做為宣告包含雙引號字元之字串的方法。 無論您使用單引號或雙引號,都應該使用相符的配對來開啟和關閉屬性值字串。 另外還有一些可用來解決任何特定 XAML 語法所加諸之字元限制的可換用順序或其他技巧。 請參閱 XML 字元實體和 XAML

為了透過屬性語法設定,屬性必須是公用的,而且必須是可寫入的。 支援型別系統中的屬性值必須是實值型別,或必須是可在存取相關的支援類型時,由 XAML 處理器具現化或參考的參考型別。

針對 WPF XAML 事件,參考為屬性名稱的事件必須是公用的,而且具有公用委派。

屬性或事件必須是包含物件專案所具現化之類別或結構的成員。

屬性值的處理

包含在開頭和右引號內的字串值是由 XAML 處理器所處理。 若為屬性,預設的處理行為取決於基礎 CLR 屬性的類型。

屬性值會使用下列處理順序填入下列其中一項:

  1. 如果 XAML 處理器遇到大括弧或衍生自的物件專案 MarkupExtension ,則會先評估參考的標記延伸,而不是以字串的形式來處理值,並使用標記延伸所傳回的物件做為值。 在許多情況下,標記延伸所傳回的物件將會是對現有物件的參考,或是延遲評估到執行時間的運算式,而不是新具現化的物件。

  2. 如果屬性是以屬性化來宣告 TypeConverter ,或該屬性的數值型別是以屬性化,則會將 TypeConverter 屬性的字串值提交至類型轉換器做為轉換輸入,而且轉換器會傳回新的物件實例。

  3. 如果沒有,則 TypeConverter 會嘗試直接轉換成屬性型別。 這最後一個層級是在 XAML 語言基本類型之間的剖析器原生值的直接轉換,或在列舉中檢查已命名常數的名稱 (剖析器接著存取相符的值) 。

列舉屬性值

XAML 中的列舉是由 XAML 剖析器本質處理,而列舉的成員則應指定列舉的其中一個列舉常數的字串名稱來指定。

針對 nonflag 列舉值,原生行為是處理屬性值的字串,並將其解析為其中一個列舉值。 您未以格式 列舉 來指定列舉。,如同您在程式碼中所做的一樣。 相反地,您只會指定 ,而且 列舉 是由您所設定之屬性的型別推斷。 如果您在 列舉 中指定屬性。 表單,將無法正確解析。

針對旗標型列舉,行為是以方法為基礎 Enum.Parse 。 您可以使用逗號分隔每個值,以指定旗標型列舉的多個值。 不過,您無法結合未旗標型的列舉值。 比方說,您無法使用逗號語法來嘗試建立 Trigger ,它會在 nonflag 列舉的多個條件上執行:

<!--This will not compile, because Visibility is not a flagwise enumeration.-->  
...  
<Trigger Property="Visibility" Value="Collapsed,Hidden">  
  <Setter ... />  
</Trigger>  
...  

在 WPF 中,支援可在 XAML 中設定之屬性的旗標型列舉很罕見。 但是,其中一個列舉是 StyleSimulations 。 例如,您可以使用以逗號分隔的旗標型屬性語法來修改類別備註中提供的範例 Glyphs ; StyleSimulations = "BoldSimulation" 可能會變成 StyleSimulations = "BoldSimulation,ItalicSimulation"KeyBinding.Modifiers 這是可以指定多個列舉值的另一個屬性。 不過,這個屬性會是特殊案例,因為 ModifierKeys 列舉支援它自己的型別轉換子。 修飾詞的類型轉換子會使用加號 (+) 作為分隔符號,而不是逗號 ( ) 。 這項轉換支援較傳統的語法,以表示 Microsoft Windows 程式設計中的按鍵組合,例如 "Ctrl + Alt"。

屬性和事件成員名稱參考

當指定屬性時,您可以參考任何存在的屬性或事件,做為您為包含物件專案所具現化之 CLR 類型的成員。

或者,您可以參考附加的屬性或附加的事件,與包含的物件專案無關。 接下來的章節會討論 (附加屬性。 )

您也可以使用 typeName 來命名可透過預設命名空間存取的任何物件的任何事件。事件 部分限定名稱;此語法支援附加處理常式來處理路由事件,其中處理常式的目的是要處理從子項目路由傳送的事件,但父元素在其成員資料表中也沒有該事件。 這個語法類似于附加事件語法,但此處的事件並不是真正的附加事件。 相反地,您會參考具有限定名稱的事件。 如需詳細資訊,請參閱 路由事件總覽

在某些案例中,屬性名稱有時會提供為屬性值,而不是屬性名稱。 該屬性名稱也可以包含辨識符號,例如以可 擁有型窗 體中指定的屬性。dependencyPropertyName。 在 XAML 中撰寫樣式或範本時,通常會發生這種情況。 提供做為屬性值之屬性名稱的處理規則是不同的,而且是由所設定之屬性的類型或特定 WPF 子系統的行為所控管。 如需詳細資訊,請參閱設定 樣式和範本

屬性名稱的另一個用法是屬性值描述屬性(property)屬性(attribute)的關聯性(property)。 這項功能可用於資料系結和分鏡腳本目標,並由 PropertyPath 類別和其型別轉換子啟用。 如需查閱語法的完整描述,請參閱 PROPERTYPATH XAML 語法

屬性元素語法

Property 元素語法 是一種語法,分歧元素的基本 XML 語法規則。 在 XML 中,屬性(attribute)的值是一種事實上的字串,唯一可能的變化是使用哪一種字串編碼格式。 在 XAML 中,您可以將其他物件元素指派為屬性的值。 這項功能是由 property 元素語法啟用。 屬性是使用 elementTypeName 中的開頭元素標記來指定,而不是在元素標記內指定為屬性的屬性。propertyName 表單,在中指定屬性的值,然後關閉屬性元素。

具體來說,語法是以左角括弧 (<), followed immediately by the type name of the class or structure that the property element syntax is contained within. This is followed immediately by a single dot (.), then by the name of a property, then by a right angle bracket (>) 。 如同屬性語法,該屬性必須存在於所指定類型的已宣告公用成員內。 要指派給屬性的值包含在 property 元素內。 通常會將值指定為一個或多個物件元素,因為將物件指定為值,就是屬性元素語法要定址的情節。 最後,指定相同 elementTypeName 的對等結束記號。您必須在適當的嵌套和與其他專案標記之間,提供 propertyName 組合。

例如,以下是的屬性的屬性元素語法 ContextMenu Button

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

如果指定的屬性類型是基本實值型別(例如 String ),或指定名稱的列舉,則 property 元素內的值也可以指定為內部文字。 這兩種使用方式並不常見,因為這兩個案例也可以使用較簡單的屬性語法。 以字串填滿屬性專案的其中一個案例是,針對非 XAML 內容屬性的屬性(property),但仍然用於表示 UI 文字,而特定的泛空白字元(例如,換換型)則需要出現在該 UI 文字中。 屬性語法不能保留換換字,但 property 元素語法可以,只要有效的空白字元保留為使用中 (如需詳細資訊,請參閱 XAML) 中 的空白字元處理。 另一種情況是,您可以將 x:Uid 指示詞套用至 property 元素,因而將中的值標示為應在 WPF 輸出 BAML 或其他技術中當地語系化的值。

WPF 邏輯樹狀結構中未表示 property 元素。 Property 元素只是用來設定屬性的特殊語法,而不是具有支援實例或物件的元素。 (如需邏輯樹狀結構概念的詳細資訊,請參閱 WPF 中的樹狀結構 )

針對屬性(attribute)和屬性(property)元素語法都支援的屬性(property),這兩個語法通常會有相同的結果,雖然微妙之處(例如空白字元處理)在語法上可能稍微不同。

集合語法

XAML 規格需要 XAML 處理器執行,以識別實值型別為集合的屬性。 .NET 中的一般 XAML 處理器實以 managed 程式碼和 CLR 為基礎,而且它會透過下列其中一項來識別集合類型:

如果屬性的類型是集合,則不需要在標記中將推斷的集合類型指定為物件元素。 相反地,要做為集合中專案的專案會指定為 property 元素的一或多個子項目。 藉由呼叫隱含集合的方法,在載入和加入至集合時,會將每個這類專案評估為物件 Add 。 例如,的 Triggers 屬性 Style 採用特製化的集合型別 TriggerCollection IList 。 不需要 TriggerCollection 在標記中具現化物件元素。 相反地,您可以指定一或多個 Trigger 專案做為屬性專案內的元素 Style.Triggers ,其中 Trigger (或衍生類別) 為強型別和隱含的專案類型所預期的類型 TriggerCollection

<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 content 屬性(在本主題的下一節中會討論)。

隱含集合專案會在邏輯樹狀結構標記法中建立成員,即使它不是以專案的形式出現在標記中也一樣。 父型別的函式通常會針對屬於它其中一個屬性的集合執行具現化,而且最初的空集合會成為物件樹狀結構的一部分。

注意

集合偵測不支援泛型清單和字典介面 (IList<T>IDictionary<TKey,TValue>) 。 不過,您可以使用 List<T> 類別作為基類,因為它會直接執行 IListDictionary<TKey,TValue> 作為基類,因為它會直接實作為基礎類別 IDictionary

在集合類型的 .NET 參考頁面中,在 XAML 語法區段中,偶爾會以隱含的集合語法來注明此語法,並刻意省略集合的 object 元素。

除了根項目之外,XAML 檔案中的每個物件元素(以另一個專案做為子專案的程式集)實際上是一個專案,也就是下列其中一個或兩個情況的專案:其父項目之隱含集合屬性的成員,或指定父元素之 XAML 上下文屬性值的專案, (XAML 內容屬性將在下一節) 中討論。 換句話說,在標記頁中,父元素和子專案的關聯性實際上是一個位於根目錄的單一物件,而根目錄底下的每個物件專案都是單一實例,可提供父系的屬性值,或是集合中的其中一個專案,也就是父系的集合型別屬性值。 這個單一根目錄概念是 XML 的通用概念,而且通常會加強載入 XAML 的 Api 行為,例如 Load

下列範例是明確指定的集合 () 的物件專案語法 GradientStopCollection

<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <GradientStopCollection>
      <GradientStop Offset="0.0" Color="Red" />
      <GradientStop Offset="1.0" Color="Blue" />
    </GradientStopCollection>
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

請注意,不一定可以明確地宣告集合。 例如,嘗試 TriggerCollection 在先前顯示的範例中明確宣告 Triggers 會失敗。 明確宣告集合需要集合類別必須支援無參數的函式,而且沒有 TriggerCollection 無參數的函式。

XAML 內容屬性

XAML 內容語法是一種語法,只會在指定為其類別宣告一部分的類別上啟用 ContentPropertyAttributeContentPropertyAttribute會參考屬性名稱,這是該專案類型的 content 屬性, (包括) 的衍生類別。 由 XAML 處理器處理時,在物件專案的開頭和結束記號之間找到的任何子項目或內部文字,將會被指派為該物件的 XAML 上下文屬性值。 您可以為 content 屬性指定明確的屬性元素,但這種用法通常不會顯示在 .NET 參考的 XAML 語法區段中。 明確/詳細技術的標記明確或標記樣式有偶值,但內容屬性的目的通常是要簡化標記,讓直覺相關的專案可以直接加上嵌套。 專案上其他屬性的屬性元素標記不會根據嚴格的 XAML 語言定義指派為「內容」;它們先前是以 XAML 剖析器的處理順序進行處理,不會被視為「內容」。

XAML 內容屬性值必須是連續的

XAML 內容屬性的值必須在該物件專案上的任何其他屬性元素之前或完全指定。 無論 XAML 內容屬性的值指定為字串,或做為一個或多個物件,都是如此。 例如,下列標記不會剖析:

<Button>I am a
  <Button.Background>Blue</Button.Background>  
  blue button</Button>  

這是不合法的,因為如果使用 content 屬性的屬性專案語法明確地設定此語法,則會將 content 屬性設定為兩次:

<Button>  
  <Button.Content>I am a </Button.Content>  
  <Button.Background>Blue</Button.Background>  
  <Button.Content> blue button</Button.Content>  
</Button>  

類似的不合法範例是,如果 content 屬性是一個集合,而子項目與 property 元素交錯:

<StackPanel>  
  <Button>This example</Button>  
  <StackPanel.Resources>  
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>  
  </StackPanel.Resources>  
  <Button>... is illegal XAML</Button>  
</StackPanel>  

內容屬性和集合語法合併

為了接受一個以上的物件專案做為內容,content 屬性的型別必須明確是集合型別。 類似于集合類型的屬性專案語法,XAML 處理器必須識別屬於集合類型的類型。 如果專案有 XAML 內容屬性,而 XAML 內容屬性的類型是集合,則隱含的集合類型不需要在標記中指定為物件專案,而且不需要將 XAML 內容屬性指定為 property 元素。 因此,標記中的明顯內容模型現在可以將一個以上的子項目指派為內容。 以下是衍生類別的內容語法 Panel 。 所有 Panel 衍生類別都會建立 XAML 內容屬性 Children ,而這需要類型的值 UIElementCollection

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  >
  <StackPanel>
    <Button>Button 1</Button>
    <Button>Button 2</Button>
    <Button>Button 3</Button>
  </StackPanel>
</Page>

請注意,標記中不需要的屬性元素和的專案 Children UIElementCollection 。 這是 XAML 的設計功能,因此定義 a 的遞迴包含元素 UI 更直覺地表示為具有立即父子式專案關聯性的嵌套元素樹狀結構,而不需要中間的屬性專案標記或集合物件。 事實上,您 UIElementCollection 無法依照設計,在標記中明確地指定為物件元素。 由於其唯一的用途是做為隱含集合,因此不 UIElementCollection 會公開公用無參數的函式,因此無法具現化為 object 元素。

使用 Content 屬性混合物件中的屬性元素和物件專案

XAML 規格會宣告 XAML 處理器可以強制執行用來填滿物件元素內 XAML 內容屬性的物件專案,必須是連續的,而且不可以是混合的。 XAML 處理器會強制執行這項限制,以避免混合屬性元素和內容 WPF 。

您可以將子物件元素做為物件專案中的第一個立即標記。 然後,您可以引進屬性專案。 或者,您可以指定一或多個屬性元素、內容,然後再指定更多屬性專案。 但是,一旦屬性元素遵循內容之後,您就無法再引入任何進一步的內容,只可以加入屬性元素。

此內容/屬性元素順序需求不適用於作為內容的內部文字。 不過,它仍然是一個很好的標記樣式,可將內部文字保持連續,因為如果屬性專案與內部文字分開,則很難在標記中以視覺化的方式偵測到顯著的空白字元。

XAML 命名空間

上述語法範例都未指定預設 XAML 命名空間以外的 XAML 命名空間。 在一般 WPF 應用程式中,預設的 XAML 命名空間會指定為 WPF 命名空間。 您可以指定預設 XAML 命名空間以外的 XAML 命名空間,但仍然使用類似的語法。 但是,如果在預設 XAML 命名空間內無法存取任何類別的名稱,則該類別名稱前面必須加上 XAML 命名空間的前置詞,以對應至對應的 CLR 命名空間。 例如, <custom:Example/> 是物件專案語法,可具現化類別的實例 Example ,其中包含該類別的 CLR 命名空間 (,且可能包含) 的支援類型的外部元件資訊先前已對應至 custom 前置詞。

如需 XAML 命名空間的詳細資訊,請參閱 WPF xaml 的 Xaml 命名空間和命名空間對應

標記延伸

XAML 定義了標記延伸程式設計實體,可讓您從一般 XAML 處理器處理字串屬性值或物件專案,並將處理延遲至支援的類別。 使用屬性語法時,識別 XAML 處理器標記延伸的字元是左大括弧 ( {) ,後面接著右大括弧 (} ) 以外的任何字元。 左大括弧後面的第一個字串必須參考提供特定延伸行為的類別,如果該子字串是 true 類別名稱的一部分,則參考可能會省略子字串 "Extension"。 之後,可能會出現一個空格,然後將每個後續字元當做延伸模組執行的輸入使用,直到遇到右大括弧為止。

.NET XAML 執行會使用 MarkupExtension 抽象類別作為所有支援的標記延伸,以及 WPF 其他架構或技術的基礎。 具體實行的標記延伸 WPF 通常是用來提供參考其他現有物件的方法,或對將在執行時間評估的物件進行延遲的參考。 例如,藉由指定 {Binding} 標記延伸來取代特定屬性通常會採用的值,即可完成簡單的 WPF 資料系結。 許多 WPF 標記延伸模組都會針對屬性語法不可能發生的屬性啟用屬性語法。 例如, Style 物件是相當複雜的類型,其中包含一系列的物件和屬性。 WPF 中的樣式通常定義為中的資源 ResourceDictionary ,然後透過要求資源的兩個 WPF 標記延伸中的其中一個來參考。 標記延伸會將屬性值的評估延遲至資源查閱,並可 Style 在屬性語法中提供屬性值(採用型別), Style 如下列範例所示:

<Button Style="{StaticResource MyStyle}">My button</Button>

在這裡,會 StaticResource 識別 StaticResourceExtension 提供標記延伸實作為的類別。 下一個字串 MyStyle 會當做非預設的函式的輸入使用 StaticResourceExtension ,而從擴充字串取得的參數會宣告要求的 ResourceKeyMyStyle 應該是定義為資源的 x:KeyStyleStaticResource 標記延伸使用方式會要求資源 Style 在載入時,透過靜態資源查閱邏輯來提供屬性值。

如需標記延伸的詳細資訊,請參閱標記延伸和 WPF XAML。 如需在一般 .NET XAML 實作為中啟用的標記延伸和其他 XAML 程式設計功能的參考,請參閱 XAML 命名空間 (x: ) 語言功能。 如需 WPF 特定的標記延伸,請參閱 WPF XAML 擴充功能。

附加屬性

附加屬性是在 XAML 中引進的程式設計概念,讓屬性可以由特定類型擁有和定義,但在任何專案上設定為屬性或屬性元素。 附加屬性的主要案例是讓標記結構中的子專案將資訊回報給父元素,而不需要跨所有元素的廣泛共用物件模型。 相反地,附加屬性可由父元素用來將資訊報告給子項目。 如需附加屬性的用途以及如何建立您自己的附加屬性的詳細資訊,請參閱 附加屬性總覽

附加屬性會使用表面上類似于屬性元素語法的語法,您也可以指定 typeNamepropertyName 組合。 有兩個重大差異:

  • 您可以使用 typeNamepropertyName 組合,即使是透過屬性語法設定附加屬性時也是一樣。 附加屬性是在屬性語法中必須限定屬性名稱的唯一情況。

  • 您也可以針對附加屬性使用屬性專案語法。 不過,對於一般的屬性元素語法,您指定的 typeName 是包含 property 專案的 object 元素。 如果您參考的是附加屬性,則 typeName 是定義附加屬性的類別,而不是包含物件元素。

附加事件

附加事件是在 XAML 中引進的另一個程式設計概念,其中事件可以由特定類型定義,但處理常式可以附加至任何物件元素。 在 WOF 的執行中,定義附加事件的類型通常是定義服務的靜態類型,而這些附加事件有時候是由公開服務之類型中的路由事件別名所公開。 附加事件的處理常式是透過屬性語法來指定。 如同附加事件,附加事件的屬性語法會展開,以允許 typeName事件名稱使用方式,其中 typeName 是提供 Add Remove 附加事件基礎結構和事件處理常式存取子的類別 ,而事件名稱則是事件名稱。

XAML 根項目的剖析

下表顯示會細分的一般 XAML 根項目,以顯示根項目的特定屬性:

<Page 開啟根項目的 object 元素
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" WPF) XAML 命名空間的預設 (
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" XAML 語言 XAML 命名空間
x:Class="ExampleNamespace.ExampleCode" 部分類別宣告,可將標記連接到針對部分類別定義的任何程式碼後端
> 根的物件元素結尾。 物件尚未關閉,因為元素包含子項目

選擇性和非建議 XAML 用法

下列各節說明 XAML 處理器技術支援的 XAML 用法,但這會產生詳細資訊或其他美觀問題,這些問題會在您開發包含 XAML 來源的應用程式時,干擾其他人可讀取的 XAML 檔案。

選擇性的屬性專案使用方式

選擇性的屬性專案使用方式包括明確地寫出 XAML 處理器視為隱含的專案內容屬性。 例如,當您宣告的內容時 Menu ,您可以選擇將的集合明確宣告 Items Menu<Menu.Items> property 元素標記,並將其放在 MenuItem 內部 <Menu.Items> ,而不是使用隱含的 XAML 處理器行為,而是將的所有子專案都 Menu 必須是, MenuItem 並放置於 Items 集合中。 有時選擇性的使用方式有助於以視覺化方式來明確地說明標記中所表示的物件結構。 或有時候明確的屬性專案使用方式,可以避免在技術上運作的標記,但以視覺上的混淆,例如屬性值內的嵌套標記延伸。

完整 typeName。成員資格限定屬性

TypeName。屬性的 成員名稱 格式其實比路由事件案例更為普遍。 但是在其他情況下,表單是多餘的,如果只有標記樣式和可讀性的原因,您應該避免這種情形。 在下列範例中,屬性的三個參考 Background 都完全相同:

<Button Background="Blue">Background</Button>
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>

Button.Background 適用的原因是,上的該屬性的限定查閱 Button 成功 (Background 繼承自 Control) ,而且 Button 是物件元素或基類的類別。 Control.Background 的運作方式 Control 是因為類別實際定義 BackgroundControlButton 基類。

但是,下列 類型名稱 為。成員名稱 形式範例無法運作,因此會顯示為批註:

<!--<Button Label.Background="Blue">Does not work</Button> -->

Label 是的另一個衍生類別 Control ,如果您已 Label.BackgroundLabel 物件元素內指定,則此使用方式會有作用。 不過,由於不 Label 是的類別或基類,因此 Button 指定的 XAML 處理器行為會以 Label.Background 附加屬性的形式處理。 Label.Background 不是可用的附加屬性,此使用會失敗。

基成員屬性元素

以類似的方式,與 typeName 的相似之處。成員名稱 形式適用于屬性語法( )。成員名稱 語法適用于屬性元素語法。 例如,下列語法有效:

<Button>Control.Background PE
  <Control.Background>
    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
      <GradientStop Color="Yellow" Offset="0.0" />
      <GradientStop Color="LimeGreen" Offset="1.0" />
    </LinearGradientBrush>
    </Control.Background>
</Button>

在這裡, Control.Background 即使屬性元素包含在中,還是會提供 property 專案 Button

但就像 typeName 一樣。 屬性的 成員名稱 形式。成員名稱 在標記中的樣式不佳,您應該避免此情況。

另請參閱