XAML 語法詳細資料
本主題定義用來描述 XAML 語法元素的詞彙。 本檔其餘部分會經常使用這些詞彙,特別是 WPF 檔,以及使用 XAML 的其他架構,或是 System.Xaml 層級上 XAML 語言支援所啟用的基本 XAML 概念。 本主題將討論 WPF 中 XAML 主題中 介紹的基本術語。
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 剖析器。
類型和類別繼承的成員
當屬性和事件顯示為 WPF 類型的 XAML 成員時,通常會繼承自基底類型。 例如,請考慮此範例: <Button Background="Blue" .../>
。 如果您要查看類別定義、反映結果或檔,則 Background 屬性不是類別上 Button 立即宣告的屬性。 Background而是繼承自基 Control 類。
WPF XAML 元素的類別繼承行為與 XML 標記的架構強制解譯有重大差異。 類別繼承可能會變得複雜,特別是當中繼基類是抽象的,或涉及介面時。 這是因為一組 XAML 元素及其允許的屬性很難正確且完全使用通常用於 XML 程式設計的架構類型,例如 DTD 或 XSD 格式。 另一個原因是 XAML 語言本身的擴充性和型別對應功能排除了允許類型和成員之任何固定標記法的完整性。
物件元素語法
物件專案語法 是 XAML 標記語法,可藉由宣告 XML 元素來具現化 CLR 類別或結構。 此語法類似于 HTML 等其他標記語言的元素語法。 Object 元素語法會以左角括弧 ( < ) 開頭,後面緊接著要具現化的類別或結構的型別名稱。 零或多個空格可以遵循類型名稱,而零個或多個屬性也可以在物件元素上宣告,其中一或多個空格會分隔每個屬性名稱=「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 物件元素的使用方式,但該元素只有在放置在整體 con帳篷模式l 或專案樹狀結構的預期位置時,才會在應用程式或頁面中正常運作。 例如, MenuItem 通常應該只放置為衍生類別的 MenuBase 子系,例如 Menu 。 特定元素的 Con帳篷模式ls 記載為控制項的類別頁面上的備註,以及其他可作為 XAML 元素的 WPF 類別。
物件元素的屬性
XAML 中的屬性是由各種可能的語法所設定。 根據您所設定之屬性的基礎類型系統特性,特定屬性可以使用哪一種語法會有所不同。
藉由設定屬性值,您可以將特徵或特性新增至物件,因為它們存在於執行時間物件圖形中。 從物件專案建立之物件的初始狀態是以無參數建構函式行為為基礎。 一般而言,您的應用程式會使用任何指定物件的完全預設實例以外的專案。
屬性 (Attribute) 語法 (屬性(Property))
屬性語法是 XAML 標記語法,可藉由在現有物件專案上宣告屬性來設定屬性的值。 屬性名稱必須符合類別之屬性的 CLR 成員名稱,該屬性會備份相關的物件專案。 屬性名稱後面接著指派運算子 (=)。 屬性值必須是以引號括住的字串。
注意
您可以使用交替引號,在屬性內放置常值引號。 例如,您可以使用單引號做為方法,宣告包含雙引號字元的字串。 無論您使用單引號還是雙引號,都應該使用相符的配對來開啟和關閉屬性值字串。 也有逸出序列或其他技術可用來解決任何特定 XAML 語法所強加的字元限制。 請參閱 XML 字元實體和 XAML 。
若要透過屬性語法設定,屬性必須是公用的,而且必須可寫入。 備份類型系統中的 屬性值必須是實值型別,或者必須是在存取相關備份類型時,XAML 處理器可以具現化或參考的參考型別。
針對 WPF XAML 事件,參考為屬性名稱的事件必須是公用且具有公用委派。
屬性或事件必須是由包含物件專案具現化之類別或結構的成員。
屬性值的處理
XAML 處理器會處理開頭和結尾引號中包含的字串值。 針對屬性,預設處理行為取決於基礎 CLR 屬性的類型。
使用下列其中一個處理順序填入屬性值:
如果 XAML 處理器遇到大括弧或衍生自 MarkupExtension 的物件專案,則會先評估參考的標記延伸,而不是將值當做字串處理,而標記延伸傳回的物件會當做值使用。 在許多情況下,標記延伸傳回的物件會是現有物件的參考,或是延遲評估直到執行時間的運算式,而且不是新具現化的 物件。
如果屬性是以 attributed 宣告,或該屬性的實值型別是以 attributed TypeConverterTypeConverter 宣告,則屬性的字串值會提交至類型轉換器做為轉換輸入,而轉換子會傳回新的物件實例。
TypeConverter如果沒有 ,則會嘗試直接轉換至屬性類型。 這個最終層級是在 XAML 語言基本類型之間的剖析器原生值直接轉換,或檢查列舉中具名常數的名稱(剖析器接著會存取相符的值)。
列舉屬性值
XAML 中的列舉是由 XAML 剖析器以內部方式處理,而列舉的成員應該藉由指定列舉的其中一個具名常數的字串名稱來指定。
對於非旗標列舉值,原生行為是處理屬性值的字串,並將其解析為其中一個列舉值。 您不會以列舉格式 指定列舉 。 值 ,如同您在程式碼中所做的一樣。 相反地,您只 指定 Value ,而 Enumeration 是由您要設定的屬性類型推斷。 如果您在列舉 中 指定屬性。 值 表單,它將無法正確解析。
針對旗標列舉,行為是以 方法為基礎 Enum.Parse 。 您可以藉由以逗號分隔每個值,為旗標列舉指定多個值。 不過,您無法合併非旗標的列舉值。 例如,您無法使用逗號語法來嘗試建立 Trigger ,以在非旗標列舉的多個條件上運作:
<!--This will not compile, because Visibility is not a flagwise enumeration.-->
...
<Trigger Property="Visibility" Value="Collapsed,Hidden">
<Setter ... />
</Trigger>
...
支援 XAML 中可設定之屬性的旗標列舉在 WPF 中很少見。 不過,這類列舉的其中一個是 StyleSimulations 。 例如,您可以使用逗號分隔的旗標屬性語法來修改 類別備註 Glyphs 中提供的範例; StyleSimulations = "BoldSimulation"
可能會變成 StyleSimulations = "BoldSimulation,ItalicSimulation"
。 KeyBinding.Modifiers 是另一個屬性,其中可以指定多個列舉值。 不過,這個屬性恰好是特殊案例,因為 ModifierKeys 列舉支援它自己的類型轉換器。 修飾詞的類型轉換器會使用加號 (+) 做為分隔符號,而不是逗號 (,)。 這項轉換支援更傳統的語法來代表 Microsoft Windows 程式設計中的按鍵組合,例如 「Ctrl+Alt」。
屬性和事件成員名稱參考
指定屬性時,您可以參考任何屬性或事件,做為您為包含物件專案具現化之 CLR 類型的成員。
或者,您可以參考附加屬性或附加事件,與包含的物件專案無關。 (後續章節將討論附加屬性。
您也可以使用 typeName ,從任何可透過預設命名空間存取的物件命名任何事件。 event partially qualified name;此語法支援附加處理常式的路由事件,其中處理常式是要處理子項目的事件路由,但父元素在其成員資料表中也沒有該事件。 此語法類似于附加事件語法,但這裡的事件不是真正的附加事件。 相反地,您會參考具有限定名稱的事件。 如需詳細資訊,請參閱路由事件概觀。
在某些情況下,屬性名稱有時會以屬性的值提供,而不是屬性名稱。 該屬性名稱也可以包含限定詞,例如表單 ownerType 中指定的屬性。 dependencyPropertyName 。 在 XAML 中撰寫樣式或範本時,這種情況很常見。 以屬性值提供之屬性名稱的處理規則不同,而且會受所設定之屬性的類型或特定 WPF 子系統的行為所控管。 如需詳細資訊,請參閱 樣式和範本化 。
屬性名稱的另一個用法是當屬性值描述屬性屬性關聯性時。 此功能用於資料系結和分鏡腳本目標,並由 類別及其類型轉換器啟用 PropertyPath 。 如需查閱語意的更完整描述,請參閱 PropertyPath XAML 語法 。
屬性元素語法
Property 元素語法 是一種語法,與元素的基本 XML 語法規則有些不同。 在 XML 中,屬性的值是事實上的字串,唯一可能的變化是使用字串編碼格式。 在 XAML 中,您可以將其他物件專案指派為 屬性的值。 此屬性專案語法會啟用這項功能。 屬性不是在元素標記內指定為屬性,而是使用 elementTypeName 中的 開頭專案標記來指定 屬性。 propertyName 表單、屬性的值是在 內指定,然後關閉屬性專案。
具體來說,語法的開頭是左角括弧 ( < ),後面緊接著屬性元素語法所包含的類別或結構類型名稱。 這會緊接在單一點 (.),然後由屬性的名稱,然後由右角括弧 ( > ) 緊接。 如同屬性語法,該屬性必須存在於指定型別的宣告公用成員內。 要指派給 屬性的值包含在屬性專案內。 一般而言,此值會指定為一或多個物件專案,因為將物件指定為值是屬性專案語法用來定址的案例。 最後,指定相同 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>
如果指定的屬性類型是基本實值型別,例如 String ,或指定名稱的列舉型別,屬性元素內的值也可以指定為內部文字。 這兩種用法有些不常見,因為每個案例也可以使用更簡單的屬性語法。 使用字串填滿屬性元素的其中一個案例,是用於不是 XAML 內容屬性的屬性,但仍用於表示 UI 文字,而特定空白字元元素,例如換行字元必須出現在該 UI 文字中。 屬性語法無法保留換行字元,但屬性元素語法可以,只要重要的空白字元保留作用中(如需詳細資訊,請參閱 XAML 中的空白字元處理)。 另一個案例是, x:Uid 指示詞 可以套用至屬性專案,因此將 中的值標示為應該當地語系化在 WPF 輸出 BAML 或其他技術中的值。
WPF 邏輯樹狀結構中不會表示屬性專案。 屬性元素只是設定屬性的特定語法,而且不是具有實例或物件支援它的專案。 (如需邏輯樹狀結構概念的詳細資訊,請參閱 WPF 中的樹狀結構。
對於同時支援屬性和屬性元素語法的屬性,這兩個語法通常會有相同的結果,不過空白字元處理等細微差別在語法之間可能會稍有不同。
集合語法
XAML 規格需要 XAML 處理器實作,以識別實數值型別為集合的屬性。 .NET 中的一般 XAML 處理器實作是以 Managed 程式碼和 CLR 為基礎,它會透過下列其中一項來識別集合類型:
類型會實作 IList 。
類型會實作 IDictionary 。
類型衍生自 Array (如需 XAML 中陣列的詳細資訊,請參閱 x:Array 標記延伸 。)
如果屬性的類型是集合,則推斷的集合類型不需要在標記中指定為物件專案。 相反地,要成為集合中專案的專案會指定為屬性元素的一或多個子專案。 每個這類專案都會在載入期間評估為 物件,並藉由呼叫 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 內容屬性,本主題下一節將討論此屬性。
隱含集合專案會在邏輯樹狀結構標記法中建立成員,即使它不會出現在標記中做為專案也一樣。 父型別的建構函式通常會執行其其中一個屬性之集合的具現化,而最初空白的集合會成為物件樹狀結構的一部分。
注意
集合偵測不支援泛型清單和字典介面 ( IList<T> 和 IDictionary<TKey,TValue> )。 不過,您可以使用 類別 List<T> 做為基類,因為它會直接實作 IList 或 Dictionary<TKey,TValue> 做為基類,因為它會直接實作 IDictionary 。
在集合類型的 .NET 參考頁面中,這個語法偶爾會在 XAML 語法區段中指出為隱含集合語法的物件元素遺漏。
除了根項目之外,巢狀為另一個元素之子項目的 XAML 檔案中的每個物件專案,其實都是下列其中一個或兩個案例的專案:其父元素之隱含集合屬性的成員,或指定父元素之 XAML 內容屬性值的專案(即將在即將討論的 XAML 內容屬性)。 換句話說,標記頁面中父元素和子項目的關聯性實際上是根目錄的單一物件,而根目錄底下的每個物件專案都是提供父系屬性值的單一實例,或是集合中的其中一個專案,也是父系的集合類型屬性值。 這個單一根概念與 XML 通用,而且經常在載入 XAML 的 Load API 行為中加強。
下列範例是具有明確指定之集合之 GradientStopCollection 物件專案的語法。
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
請注意,不一定可以明確宣告集合。 例如,嘗試在先前顯示的 Triggers 範例中明確宣告 TriggerCollection 將會失敗。 明確宣告集合需要集合類別必須支援無參數建構函式,而且 TriggerCollection 沒有無參數建構函式。
XAML 內容屬性
XAML 內容語法是只在其類別宣告中指定 ContentPropertyAttribute 的類別上啟用的語法。 會 ContentPropertyAttribute 參考屬於該專案類型內容屬性的屬性名稱(包括衍生類別)。 由 XAML 處理器處理時,在物件專案的開頭和結束記號之間找到的任何子專案或內部文字,都會指派為該物件的 XAML 內容屬性值。 您可以指定內容屬性的明確屬性元素,但此用法通常不會顯示在 .NET 參考的 XAML 語法區段中。 明確/詳細資訊技術偶爾會有標記清楚或標記樣式的值,但通常內容屬性的意圖是簡化標記,讓直覺上與父子系相關的元素可以直接巢狀化。 元素上其他屬性的屬性標記不會根據嚴格的 XAML 語言定義指派為「內容」;它們先前是在 XAML 剖析器處理順序中處理,且不會被視為「內容」。
XAML 內容屬性值必須是連續的
XAML 內容屬性的值必須完全指定在該物件專案上的任何其他屬性專案之前或完全之後。 不論 XAML 內容屬性的值是指定為字串,還是指定為一或多個物件,都是如此。 例如,下列標記不會剖析:
<Button>I am a
<Button.Background>Blue</Button.Background>
blue button</Button>
這基本上是非法的,因為如果使用 content 屬性的 property 元素語法明確使用此語法,則內容屬性會設定兩次:
<Button>
<Button.Content>I am a </Button.Content>
<Button.Background>Blue</Button.Background>
<Button.Content> blue button</Button.Content>
</Button>
同樣不合法的範例是,如果 content 屬性是集合,而子項目則與屬性元素交織在一起:
<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 內容屬性不需要指定為屬性專案。 因此,標記中的明顯 con帳篷模式l 現在可以將多個子項目指派為內容。 以下是衍生類別的內容語法 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 的設計功能,可讓以遞迴方式包含定義 UI 的元素,更直覺地表示為具有直接父子專案關聯性的巢狀元素樹狀結構,而不需要介入屬性元素標記或集合物件。 事實上,根據設計, UIElementCollection 無法在標記中明確指定為物件專案。 因為它唯一的用途是做為隱含集合,所以不會公開公用無參數建構函式, UIElementCollection 因此無法具現化為物件專案。
混合物件中的屬性元素和物件元素與 Content 屬性
XAML 規格會宣告 XAML 處理器可以強制執行用來填滿物件專案內 XAML 內容屬性的物件專案必須連續,而且不得混合。 WPF XAML 處理器會強制執行這項混合屬性元素和內容的限制。
您可以讓子物件專案成為物件專案內的第一個直接標記。 然後,您可以引進屬性元素。 或者,您可以指定一或多個屬性元素,然後指定內容,再指定更多屬性元素。 但是,一旦屬性元素跟隨內容,就無法導入任何進一步的內容,您只能新增屬性元素。
此內容/屬性元素順序需求不適用於做為內容的內部文字。 不過,如果屬性元素與內部文字交織在一起,則保持內部文字連續仍然是不錯的標記樣式,因為如果屬性元素與內部文字交織在標記中,則很難以視覺化方式偵測。
XAML 命名空間
上述語法範例都未指定預設 XAML 命名空間以外的 XAML 命名空間。 在一般 WPF 應用程式中,預設的 XAML 命名空間會指定為 WPF 命名空間。 您可以指定預設 XAML 命名空間以外的 XAML 命名空間,但仍使用類似的語法。 但是,在預設 XAML 命名空間中無法存取類別名稱的任何位置,該類別名稱前面必須加上與對應 CLR 命名空間對應的 XAML 命名空間前置詞。 例如, <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 建構函式的輸入,其中從擴充字串取得的參數會宣告要求的 ResourceKey 。 MyStyle
必須是 定義為資源的 x:Key 值 Style 。 StaticResource 標記延伸 使用方式會要求資源在載入時透過靜態資源查閱邏輯提供 Style 屬性值。
如需標記延伸的詳細資訊,請參閱標記延伸和 WPF XAML。 如需在一般 .NET XAML 實作中啟用之標記延伸和其他 XAML 程式設計功能的參考,請參閱 XAML 命名空間 (x:) 語言功能 。 如需 WPF 特定的標記延伸,請參閱 WPF XAML 延伸模組 。
附加屬性
附加屬性是 XAML 中引進的程式設計概念,可由特定類型擁有和定義屬性,但在任何元素上設定為屬性或屬性元素。 附加屬性的主要案例是讓標記結構中的子專案向父元素報告資訊,而不需要跨所有元素廣泛共用的物件模型。 相反地,父元素可以使用附加屬性將資訊報告給子項目。 如需附加屬性用途以及如何建立您自己的附加屬性的詳細資訊,請參閱 附加屬性概觀 。
附加屬性會使用表面上類似于屬性元素語法的語法,在該語法中,您也會指定 typeName 。 propertyName 組合。 有兩個重大差異:
您可以使用 typeName 。 propertyName 組合,即使透過屬性語法設定附加屬性也一定。 附加屬性是屬性語法中唯一符合屬性名稱需求的情況。
您也可以使用附加屬性的屬性元素語法。 不過,針對一般屬性元素語法, 您指定的 typeName 是包含屬性元素的物件專案。 如果您參考附加屬性,則 typeName 是定義附加屬性的類別,而不是包含的物件專案。
附加事件
附加事件是 XAML 中導入的另一個程式設計概念,其中事件可由特定類型定義,但處理常式可以附加在任何物件元素上。 在 WOF 實作中,定義附加事件的型別通常是定義服務的靜態類型,有時這些附加事件會由公開服務的型別中的路由事件別名公開。 附加事件的處理常式是透過屬性語法來指定。 如同附加事件,附加事件的屬性語法會展開,以允許 typeName 。 eventName 使用方式,其中 typeName 是提供 Add
附加事件基礎結構之 事件處理常式存取子的 Remove
類別,而 eventName 是事件名稱。
XAML 根項目的結構
下表顯示一般 XAML 根項目細分,其中顯示根項目的特定屬性:
屬性 | 描述 |
---|---|
<Page |
開啟根項目的物件專案 |
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 檔案的人類可讀性。
Optional Property 元素使用方式
選擇性的屬性元素使用方式包括明確寫出 XAML 處理器認為隱含的專案內容屬性。 例如,當您宣告 的內容 Menu 時,您可以選擇明確地將 的集合宣告 Items 為 <Menu.Items>
屬性專案標記,並將每個 <Menu.Items>
MenuItem 專案 Menu 放在 內,而不是使用 隱含的 XAML 處理器行為,讓 的所有子專案 Menu 都必須 MenuItem 是 ,並放在集合中 Items 。 有時候選擇性的使用方式有助於以視覺化方式厘清標記中所表示的物件結構。 或者,有時候明確的屬性元素使用方式可以避免在技術上運作但視覺上令人困惑的標記,例如屬性值內的巢狀標記延伸。
Full typeName.memberName Qualified Attributes
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 的限定查閱成功 ( Background 繼承自 Control),而且 Button 是物件專案或基類的類別。 Control.Background
會運作,因為 類別 Control 實際上會 Background 定義 和 Control 是 Button 基類。
不過,下列 typeName 。 memberName 表單範例無法運作,因此會顯示批註:
<!--<Button Label.Background="Blue">Does not work</Button> -->
Label是 的另一 Label 個衍生類別 Control ,如果您已在物件專案內指定 Label.Background
,則此使用方式會正常運作。 不過,由於 Label 不是 的 Button 類別或基類,因此指定的 XAML 處理器行為是接著以附加屬性處理 Label.Background
。 Label.Background
不是可用的附加屬性,而且此使用方式失敗。
baseTypeName.memberName 屬性元素
以類似于 typeName 的方式 。 memberName 表單適用于屬性語法 baseTypeName 。 memberName 語法適用于屬性專案語法。 例如,下列語法可運作:
<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>
在這裡,即使 屬性專案包含在 中 Button
,屬性元素也一樣 Control.Background
。
但就像 typeName 一樣 。 屬性的 memberName 表單, baseTypeName 。 memberName 在標記中樣式不佳,您應該避免它。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應