XAML 語法術語
更新:2007 年 11 月
本主題定義用於描述可延伸標記語言 (XAML) 語法項目的詞彙。在本軟體開發套件 (SDK) 的其餘部分會常常使用到這些詞彙。本主題會擴充 XAML 概觀中介紹的基本術語。
這個主題包含下列章節。
- XAML 語法術語的起源
- 物件項目語法
- 屬性語法
- 屬性項目語法
- XAML 內容語法
- 附加屬性
- 附加事件
- Xml 命名空間
- 標記延伸
- 選擇性和非建議的 XAML 使用方式
- 相關主題
XAML 語法術語的起源
這裡所定義的 XAML 語法術語,也在 XAML 語言規格內定義或參考。XAML 是一種以 XML 為基礎的語言,並依循 XML 結構規則。描述 XML 語言或 XML 文件物件模型 (DOM) 時,有些術語是以常用的術語為基礎,或共用這些常用術語。
物件項目語法
「物件項目語法」(Object Element Syntax) 是 XAML 標記語法,會藉由宣告 XML 項目具現化 Common Language Runtime (CLR) 類別或結構。這種語法類似其他標記語言的項目語法,例如 HTML。物件項目語法是以左角括弧 (<) 開頭,緊接著跟隨要具現化的類別或結構的型別名稱。型別名稱後可以跟隨零或多個空白,而且物件項目也可以宣告零或多個屬性 (Attribute),其中會以一個或多個空白區隔每對「屬性名稱="值"」。最後,下列其中一個條件必須成立:
項目和標記 (Tag) 必須以正斜線 (/) 再緊接著右角括弧 (>) 結束。
開頭標記必須以右角括弧 (>) 結束。其他物件項目、屬性 (Property) 項目或內部文字可以跟在開頭標記之後。這裡可以包含的確切內容,通常是由項目的物件模型所限制,請參閱本主題的「內容語法」部分。物件項目的對等結尾標記也必須存在,而且在巢狀結構中需適當配置,並與其他的開頭和結尾標記成對對稱。
舉例來說,下列範例的物件項目語法會產生 Button 類別的新執行個體,也會指定 Name 屬性 (Attribute) 和該屬性值:
<Button Name="CheckoutButton"/>
下列範例的物件項目語法也包含可延伸標記語言 (XAML) 內容屬性語法。其中包含的內部文字將用於設定 TextBox 可延伸標記語言 (XAML) 內容屬性 Text。
<TextBox>This is a Text Box</TextBox>
屬性語法
「屬性語法」(Attribute Syntax) 是 XAML 標記語言,會藉由宣告項目屬性 (Attribute),設定屬性 (Property) 值或是為事件的事件處理常式命名。項目一定是透過物件項目語法宣告的。屬性 (Attribute) 名稱必須符合屬性 (Property) 或者是事件的 CLR 成員名稱。屬性 (Attribute) 名稱後會接著指派 (Assignment) 運算子 (=)。屬性 (Attribute) 值必須是以成對引號 (") 括住的字串。
為了要透過屬性 (Attribute) 語法設定,屬性 (Property) 必須是公用、可讀寫,而且屬性 (Property) 值的型別必須能夠由 XAML 處理器具現化和參考。對於事件而言,事件必須是公用的並具有公用委派。屬性 (Property) 或事件必須是包含物件項目所產生的類別或結構的成員。
屬性 (Attribute) 值必須填入下列其中一個項目,並依這個處理順序:
如果 XAML 處理器遇到大括號或是衍生自 MarkupExtension 的物件項目,那麼會先評估參考的標記延伸,而不會以字串進行處理,然後會使用標記延伸傳回的物件。在許多情況下,標記延伸傳回的物件,會是現有物件的參考,或是將評估延後到執行階段而目前非新物件的運算式。
如果屬性 (Property) 是以指定的 TypeConverter 宣告的,或是該屬性 (Property) 值的型別是以 TypeConverter 屬性 (Attribute) 宣告的,則屬性 (Attribute) 的字串值會送出給型別轉換子做為轉換輸入,而轉換子會傳回新的物件執行個體。
如果沒有 TypeConverter,會嘗試屬性型別 (Property Type) 的直接轉換。這最後一道作業,是基本型別間的直接轉換,或是檢查列舉型別中的名稱 (會傳回相符值)。
舉例來說,如果使用如上所示的標記,下列範例的屬性 (Attribute) 語法是用於指派 Name 屬性 (Property) 的字串值:
<Button Name="CheckoutButton"/>
Name 屬性 (Property) 是 Button 類別的成員表的成員。Button 是定義 Name 的 FrameworkElement 類別的衍生類別。
屬性值的處理
成對引號括住的字串是由 XAML 處理器進行處理。對於屬性 (Property) 而言,預設的處理行為是由基礎 CLR 屬性 (Property) 的型別決定的。如果屬性 (Property) 是基本型別,則會依據字串的隱含轉換將屬性 (Attribute) 值指派給相關基本型別。如果屬性 (Property) 是列舉型別,則會以該列舉型別定義的名稱來處理字串,並傳回列舉型別中的相符值。如果屬性 (Property) 不是基本型別或列舉型別,則屬性 (Attribute) 值必須由屬性 (Property) 本身或目的型別所宣告的型別轉換子進行處理。型別轉換子必須提供接受字串的轉換,且必須產生基礎 CLR 屬性 (Property) 之型別的執行個體。轉換步驟也可能會透過標記延伸而延後。
列舉型別屬性值
XAML 中的列舉值基本上是由 Enum 結構的原生方法處理。
對於非旗標列舉值,原生的行為是處理屬性 (Attribute) 值的字串,並將其解析為其中一個列舉值。如同在程式碼中的方式一樣,不會以 Enumeration.Value 的格式指定列舉型別。而是只指定 Value,而 Enumeration 則由您設定的屬性 (Property) 型別推斷。如果屬性 (Attribute) 是以 Enumeration.Value 格式指定,將無法正確解析。
對於旗標式的列舉型別,該行為則是依據 Enum.Parse 方法。您可以為旗標式的列舉型別指定多個值,並以逗號分隔每個值。然而,您不可以結合非旗標式的列舉值。例如,您無法將逗號語法嘗試使用在建立作用於非旗標列舉型別的多個條件的 Trigger:
<!--This will not compile, because Visibility is not a flagwise enumeration.-->
...
<Trigger Property="Visibility" Value="Collapsed,Hidden">
<Setter ... />
</Trigger>
...
支援 XAML 中可設定屬性 (Attribute) 的旗標式列舉型別,在 WPF 中很少。然而,有一個這類的列舉型別是 StyleSimulations。舉例來說,您可以使用以逗號分隔的旗標式屬性 (Attribute) 語法修改註解中所提供的 Glyphs 類別範例。StyleSimulations = "BoldSimulation" 可以改成 StyleSimulations = "BoldSimulation,ItalicSimulation"。KeyBinding.Modifiers 是另一個可以指定一個以上之列舉值的屬性 (Property)。然而這個屬性 (Property) 是個特例,因為 ModifierKeys 列舉型別支援自己的型別轉換子。修飾詞 (Modifier) 的型別轉換子使用加號 (+) 而非逗號 (,) 做為分隔符號,這樣標記中就支援更為傳統的組合鍵代表語法,例如 CTRL+ALT。
屬性和事件成員名稱參考
指定屬性 (Attribute) 時,您可以參考任何屬於您為包含物件項目具現化之 CLR 型別成員的屬性 (Property) 或事件。
或者,您也可以參考與包含物件項目無關的附加屬性 (Property) 或附加事件。
如果任何事件是來自可以透過預設命名空間存取的任何物件,您也可以藉由使用 typeName.event 不完整名稱,為事件命名。這個語法支援路由事件的附加處理常式,其中的處理常式是設計用來處理來自子項目的事件路由,但該事件並不在父項目的成員表中。這個語法類似於附加事件語法,但這裡的事件並不是真的附加事件。而您是以完整名稱參考事件。如需詳細資訊,請參閱路由事件概觀。
屬性 (Property) 名稱有時候是以屬性 (Attribute) 值提供,而非屬性 (Attribute) 名稱,且該屬性 (Property) 名稱也可以包含限定詞,例如以 ownerType.dependencyPropertyName 格式指定的屬性 (Property)。在 XAML 中撰寫樣式和樣板時,常常見到這種案例。將屬性 (Property) 名稱以屬性 (Attribute) 值提供的處理規則有許多種,而且是由要設定的屬性 (Property) 型別所控制,並依據一些內容因素而決定,例如樣式或樣板是否具有目標型別。如需詳細資訊,請參閱設定樣式和範本。
屬性 (Property) 名稱另一個使用時機,是在屬性 (Attribute) 值描述屬性 (Property) 對屬性 (Property) 的關係時。這個功能用於資料繫結和腳本目標,並透過 PropertyPath 類別及其型別轉換子啟用。如需查閱語意的完整描述,請參閱 PropertyPath XAML 語法。
屬性項目語法
「屬性項目語法」(Property Element Syntax) 這種語法,與基本 XML 語法有某種程度的不同。XML 中的屬性 (Attribute) 值事實上是字串,唯一可能有的變異在於使用哪種字串編碼格式。在 XAML 中,您可以指派其他物件項目做為屬性 (Property) 值。這個功能是藉由屬性 (Property) 項目語法啟用的。屬性 (Property) 並不會指定為項目標記內屬性 (Attribut),而改以 elementTypeName.propertyName 格式使用開頭項目標記、指定屬性 (Property) 值,然後再結束屬性 (Property) 項目的方式指定屬性 (Property)。
具體來說就是,語法是以左角括弧 (<) 開頭,緊接著跟隨內含屬性 (Property) 項目語法的類別或結構的型別名稱。後面緊接著英文句號 (.)、指定型別成員表內必須存在的屬性名稱,然後是右角括弧 (>)。要指派給屬性的值是包含在屬性項目內。通常會指定一個或多個物件項目做為值,因為將物件指定為值本來就是屬性項目語法要解決的案例。最後必須提供用於指定相同 elementTypeName.propertyName 組合的對等結尾標記,而且在巢狀結構中需適當配置,並與其他項目標記對稱。舉例來說,以下是 Button 的 ContextMenu 屬性的屬性項目語法。
<Button>
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="1">First item</MenuItem>
<MenuItem Header="2">Second item</MenuItem>
</ContextMenu>
</Button.ContextMenu>
Right-click me!</Button>
當指定的屬性型別 (Property Type) 為基本實值型別 (例如 String),或是已指定名稱的列舉型別時,屬性 (Property) 項目中的值也可以使用內部文字的方式提供。這兩種使用方式並不常見,因為他們也都支援屬性 (Attribute) 語法。使用字串填入屬性 (Property) 項目的一個案例,是當屬性 (Property) 不是 XAML 內容屬性 (Property) 卻仍用於表示 UI 文字時,且該 UI 文字中必須出現特殊的空白字元項目,例如換行字元。屬性 (Attribute) 語法無法保留換行字元,但只要關鍵的空白字元保留是有效的,屬性 (Property) 項目語法就可以保留換行字元 (如需詳細資訊,請參閱 XAML 中的泛空白字元處理)。
屬性 (Property) 項目不會出現在邏輯樹狀結構中。屬性 (Property) 項目只是用於設定屬性 (Property) 的特殊語法,並不是具有支援執行個體或物件的項目。
集合型別的屬性項目語法
XAML 規格需要 XAML 處理器實作,才能夠識別其實值型別是集合的屬性 (Property)。WPF 實作是依據 Managed 程式碼進行的,而其 XAML 處理器會透過下列其中一種方式識別集合型別:
實作 IList。
實作 IDictionary。
衍生自 Array (如需 XAML 中陣列的詳細資訊,請參閱 x:Array 標記延伸)。
如果屬性的型別是集合,則標記中不一定要指定推斷的集合型別。但是,設計要成為集合項目 (Item) 的項目 (Element),就要指定成為集合型別屬性項目 (Element) 的一個或多個子項目 (Element)。這類的每個項目 (Item) 在載入期間會評估為物件,並且藉由呼叫隱含集合的 Add 方法來加入集合。舉例來說,Style 的 Triggers 屬性會採用專屬的集合型別 TriggerCollection。但並沒有必要在標記中產生 TriggerCollection。而是改為將一個或多個 Trigger 項目 (Item) 指定為 Style.Triggers 屬性項目 (Element) 內的項目 (Element),其中的 Trigger (或衍生類別) 的型別預期是強式型別和隱含 TriggerCollection 的項目 (Item) 型別。
<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 內容屬性。
隱含集合項目 (Element) 會在邏輯樹狀結構中建立成員,即使它在標記中並未顯示為項目 (Element)。通常,擁有者型別的建構函式會對身為它的一個屬性的集合執行具現化,將集合加入樹狀結構中。
注意事項: |
---|
WPF XAML 處理器在偵測集合時不支援泛型清單和字典介面 (IList<T> 和 IDictionary<TKey, TValue>)。然而您可以使用 List<T> 類別做為基底類別,因為它直接實作 IList,或是使用 Dictionary<TKey, TValue> 做為基底類別,因為它直接實作 IDictionary。 |
XAML 內容語法
XAML 內容語法這種語法,只會在將 ContentPropertyAttribute 指定為類別宣告一部分的類別上啟用。ContentPropertyAttribute 需要依名稱指定屬性 (Property) 的參數,用來定義做為該項目 (Element) 型別 (包含衍生類別) 的內容屬性。以這種方式指定的屬性即為項目的 XAML 內容屬性。經過 XAML 處理器處理時,在項目的開頭和結尾標記間的任何子項目或內部文字,將會指派成為該 XAML 內容屬性的值。如果您希望讓內容屬性的標記明確,可以為內容屬性指定屬性項目。這項技術在標記的清晰度或在做為標記樣式時有一些價值,但通常內容屬性的目的是要簡化標記,讓直覺性關聯為父子項目的項目能夠直接形成巢狀結構。項目上其他屬性的屬性項目標記不是指派為「內容」。他們會先在剖析器工作流程中經過處理,而不會被視為「內容」。
跟任何其他屬性一樣,物件的 XAML 內容屬性會屬於特定的型別。該型別可以是 Object 型別。該內容屬性的型別有助於定義物件的內容模型。例如,Object 的型別是很鬆散的,讓人不太覺得任何物件可能會成為內容,但即使是這樣的鬆散型別 (Loose Typing) 也代表內容必須是單一物件。單一物件可以是集合物件,即便如此,也只能有一個這類的集合物件指派成為內容。
在 WPF 文件中,特殊型別的內容模型,在該型別的類別頁面上會有所描述,或是會撰寫成型別系列的個別概念性主題,可以從每個相關型別參考進行連結。
集合型別的內容語法
為了能夠接受一個以上的物件項目 (或內部文字) 做為內容,內容屬性 (Property) 的型別必須特別是集合型別。跟集合型別的屬性項目語法類似,XAML 處理器必須辨識屬於集合型別的型別。如果項目有 XAML 內容屬性,且 XAML 內容屬性的型別為集合,則隱含的集合型別不需要在標記中指定為物件項目,且 XAML 內容屬性不需要指定為屬性項目。因此,現在標記中的內容模型在外觀上可以有一個以上的子項目指派做為內容。下列為 Panel 衍生類別的內容語法。所有的 Panel 衍生類別都會將 XAML 內容屬性建立為 Children,而需要型別 UIElementCollection 的值。
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
>
<StackPanel>
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>Button 3</Button>
</StackPanel>
</Page>
請注意,標記 (Markup) 中既不需要 Children 的屬性項目,也不需要 UIElementCollection 的項目。這是 XAML 設計上的功能,這樣定義 UI 的遞迴包含項目可以使用直接的父子項目關聯性,更為直覺地以巢狀項目的樹狀結構表示,而不需要插入無關緊要的屬性項目標記 (Tag) 或集合物件。事實上,根據設計,在標記 (Markup) 中不能將 UIElementCollection 指定為物件項目。因為它唯一的使用目的是做為隱含集合,UIElementCollection 不會公開公用預設建構函式,因而無法以物件項目產生。
具有內容屬性的物件中的混合屬性項目和物件項目
對用於在物件項目內填入 XAML 內容屬性 (Property) 的物件項目,XAML 規格會宣告 XAML 處理器可以強制讓物件項目必須是連續的,而且不能混合物件項目。這項針對混合屬性項目和內容的限制,是由 WPF XAML 處理器所強制執行。
您可以讓子物件項目做為物件項目內的第一個直接標記。然後引入屬性項目。或者,您可以指定一個或多個屬性項目,接著是內容,然後是多個屬性項目。但只要內容後面接著屬性項目,您就不能引入任何進一步的內容,而只能加入屬性項目。
這項內容/屬性項目的順序要求,並不適用於將內部文字用來做為內容的情形。然而,讓內部文字保持連續仍然是較好的標記樣式,因為在內部文字中穿插屬性項目時,標記中的重要空白字元在視覺上很難偵測。
附加屬性
附加屬性 (Property) 是 XAML 中引入的程式設計概念,在這個概念下,型別可以擁有和定義屬性,但屬性卻能設於任何項目。附加屬性設計上的主要案例是讓項目樹狀結構中的子項目,可以回報資訊給父項目,而不需要在所有項目上廣泛地共用物件模型。反之,附加屬性也可以由父項目用來回報資訊給子項目。如需附加屬性設計目的和如何建立自己的附加屬性的詳細資訊,請參閱附加屬性概觀。
附加屬性使用的語法有一點類似屬性項目語法,其中您也是指定 typeName.propertyName 的組合。但是有兩個重大差異:
即使在透過屬性 (Attribute) 語法設定附加屬性 (Property) 時,您還是可以使用 typeName.propertyName 組合。而附加屬性 (Property) 是唯一要求要限定屬性 (Property) 名稱的屬性 (Attribute) 語法案例。
您也可以為附加屬性 (Property) 使用屬性項目語法。然而,對於一般的屬性項目語法,您指定的 typeName 是包含屬性項目的物件項目。如果參考的是附加屬性,則 typeName 是定義附加屬性的類別,而不是包含物件項目。
附加事件
附加事件是 XAML 中引入的另一個程式設計概念,在這個概念下,型別可以定義事件,但處理常式卻可能附加到任何物件上。通常定義附加事件的型別是定義服務的靜態型別,而有時候那些附加事件是由公開服務的型別中的路由事件別名所公開。附加事件的處理常式是透過屬性 (Attribute) 語法而指定的。與附加事件一起使用時,屬性 (Attribute) 語法會為附加事件展開以允許使用 typeName.eventName,其中 typeName 是針對附加事件基礎結構提供 Add 和 Remove 事件處理常式存取子的類別,而 eventName 則是事件名稱。
Xml 命名空間
前述的語法範例指定的命名空間,都沒有超出預設命名空間的範圍。在一般的 WPF 應用程式中,預設的命名空間會指定為 WPF 命名空間。您可以指定預設命名空間以外的命名空間,而仍然使用本質上相同的語法種類,但是在預設命名空間內無法存取類別名稱的任何情況下,該類別名稱必須使用 XML 命名空間的前置字元開頭,用於對應相對的 CLR 命名空間。例如,<custom:MyElement/> 為物件項目語法,用於具現化 MyElement 類別的執行個體,其中包含該類別 (也可能是包含該命名空間的外部組件) 的 CLR 命名空間,已事先對應到 custom 前置字元。
如需 XML 命名空間和 XAML 的詳細資訊,請參閱 XAML 命名空間和命名空間對應。
標記延伸
XAML 定義的「標記延伸」(Markup Extension) 程式設計實體 (Entity),可以逸出屬性 (Attribute) 或物件項目的一般 XAML 處理器處理,並將處理延後到支援類別中。XAML 處理器的 WPF 實作使用 MarkupExtension 抽象類別,做為 WPF 所支援所有標記延伸的基礎。在使用屬性 (Attribute) 語法時,用於識別 XAML 處理器標記延伸的字元,是一個左大括號 ({),再加上右大括號 (}) 以外的任何其他字元。左大括號後接的第一個字串必須參考提供特定延伸行為的類別,如果子字串是真實類別名稱的一部分,則這裡的參考可以省略子字串 "Extension"。之後,可以保留一個空格,然後每個後續字元都可以做為延伸實作的輸入,直到遇到右大括號為止。WPF 中延伸標記的主要目的,是在使用屬性 (Attribute) 語法的情況下,提供其他已經存在物件的參考方式,或是延後要於執行階段評估之對物件的參考。例如,若要完成簡單的資料繫結,可以指定 {Binding} 標記延伸來取代指定屬性 (Property) 通常應該採用的實值型別。許多標記延伸,讓屬性 (Property) 可以在非得使用屬性 (Attribute) 語法的情況下使用屬性 (Attribute) 語法。例如,Style 物件是相當複雜的參考型別,其中包含數種其他屬性 (Property),每個屬性 (Property) 也都採用 byref 物件而非基本物件。但樣式通常是以資源建立的,然後再透過兩種用於要求資源的延伸標記中的一種來參考。延伸會將屬性 (Property) 值的評估延後到資源查閱,以下列屬性 (Attribute) 語法提供 Style 屬性 (Property) 值、採用型別 Style:
<Button Style="{StaticResource MyStyle}">My button</Button>
其中,StaticResource 會識別提供標記延伸實作的 StaticResourceExtension 類別。下一個字串 MyStyle 是用來做為非預設 StaticResourceExtension 建構函式的輸入,其中從延伸字串取得的參數會宣告要求的 ResourceKey。MyStyle 預期是定義做為資源的 Style 的 x:Key 屬性值。StaticResource 標記延伸使用方式要求將資源用於在載入時間 (Load Time) 透過靜態資源查閱邏輯來提供 Style 屬性 (Property) 值。
如需標記延伸的詳細資訊,請參閱標記延伸和 XAML。如需延伸標記參考和其他 XAML 程式設計功能,請參閱 XAML 命名空間 (x:) 語言功能和 WPF 命名空間 XAML 擴充。
選擇性和非建議的 XAML 使用方式
選擇性的屬性項目使用方式
選擇性的屬性 (Property) 項目使用方式包括具體將 XAML 處理器視為隱含的項目內容屬性「詳加說明」。舉例來說,當您宣告 Menu 的內容時,可以選擇將 Menu 的 Items 集合明確宣告為 <Menu.Items> 屬性 (Property) 項目標記 (Tag),然後在 <Menu.Items> 中加入每個 MenuItem,而不是使用隱含的 XAML 處理器行為,在其中 Menu 的所有子項目都必須是 MenuItem 並置放在 Items 集合中。有時候,選擇性的使用方式有助於以視覺方式釐清標記 (Markup) 中呈現的物件結構。或者,有時候明確屬性 (Property) 項目使用方式可以避免在技術上具有功能、卻會在視覺上造成混淆的標記 (Markup),例如屬性 (Attribute) 值內的巢狀標記延伸。
完整的 typeName.memberName 屬性
屬性 (Attribute) 的 typeName.memberName 格式實際上比單純的路由事件更為通用,但在其他應用程式中,如果僅因為標記樣式和可讀性的原因,該格式是非必要的,應該要避免使用。在下列範例中,對於 Background 屬性的三個參考,其實都是完全相等的:
<Button Background="Blue">Background</Button>
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>
Button.Background 能夠運作的原因是,在 Button 上該屬性 (Property) 的限定查閱是成功的 (Background 繼承自 Control),而 Button 是物件項目的類別或基底類別。Control.Background 能夠運作的原因是,實際定義 Background 和 Control 的 Control 類別是 Button 基底類別。
然而,下列 typeName.memberName 格式範例則無法運作,因此顯示為註解:
<!--<Button Label.Background="Blue">Does not work</Button> -->
Label 是 Control 的另一個衍生類別,而且如果已經在 Label 物件項目內指定 Label.Background,則這種使用方式應該可以運作。然而,因為 Label 不是 Button 的類別或基底類別,指定的 XAML 處理器行為就會接著將 Label.Background 當做附加屬性 (Property) 處理。可是,Label.Background 並不是附加屬性 (Property),所以這個使用方式會失敗。
baseTypeName.memberName 屬性項目
有關 typeName.memberName 格式針對屬性 (Attribute) 語法的運作方式,就好比 baseTypeName.memberName 語法針對屬性 (Property) 項目語法的運作方式。例如,下列語法即可以運作:
<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>
即使屬性 (Property) 項目已包含在 Button 中,這裡的屬性 (Property) 項目指定為 Control.Background。
但就像屬性 (Attribute) 的 typeName.memberName 格式,baseTypeName.memberName 是不好的標記樣式,而基於樣式的原因您應該避免使用。