XAML文法術語基礎教程(1)

來源:互聯網
上載者:User

本主題定義用來描述可擴充應用程式標記語言 (XAML) 文法的各個元素的術語。這些術語將在本軟體開發套件 (SDK) 的其餘部分中經常用到。本主題擴充了 XAML 概述中所介紹的基本術語。

XAML 文法術語的起源

此處定義的 XAML 文法術語在 XAML 語言規範中也有定義或引用。XAML 是一種基於 XML 且遵循 XML 結構規則的語言。其中的術語共用自或基於描述 XML 語言或 XML 文件物件模型 (DOM) 時的常用術語。

對象元素文法

對象元素文法是一種 XAML 標記文法,它通過聲明 XML 元素來執行個體化公用語言運行庫 (CLR) 類或結構。此文法與其他標記語言(例如 HTML)的元素文法相似。對象元素文法以左角括弧 (<) 開頭,其後緊跟正進行執行個體化的類或結構的類型名稱。類型名稱後面可以有零個或多個空格,對於對象元素還可以聲明零個或多個屬性,並用一個或多個空格來分隔每個“屬性名稱="值"”對。最後,必須存在下列一種情況:

元素和標記必須用正斜杠 (/) 和緊跟的右角括弧 (>) 結尾。

開始標記必須以右角括弧 (>) 結尾。其他對象元素、屬性元素或內部文本可以跟在開始標記後面。對象元素還必須存在等效的結束標記,並與其他開始標記/結束標記對形成正確的嵌套和平衡。

例如,下面的樣本是一個對象元素文法,該文法執行個體化 Button 類的一個新執行個體,而且還指定了一個 Name 屬性及其值:

下面的樣本是一個還包括可擴充應用程式標記語言 (XAML) 內容屬性文法的對象元素文法。其中包含的內部文本將用來設定 TextBox 可擴充應用程式標記語言 (XAML) 內容屬性 Text。

屬性文法

屬性文法是一種 XAML 標記文法,該文法通過針對元素宣告屬性 (Attribute) 來設定屬性 (Property) 值或者命名事件的事件處理常式。元素總是通過對象元素文法來聲明。屬性名稱必須與屬性或事件的 CLR 成員名稱相匹配。屬性名稱後面是賦值運算子 (=)。屬性值必須是一個用雙引號 (") 引起來的字串。

為了能夠通過屬性文法進行設定,屬性必須是公用的、可讀寫的,而且必須具有一個可以由 XAML 處理器執行個體化或引用的屬性值類型。對於事件來說,事件必須是公用的而且必須具有一個公用委託。屬性或事件必須是由包含對象元素執行個體化的類或結構的成員。

屬性值由下面的操作之一,按照如下處理順序進行填充:

如果 XAML 處理器遇到一個大括弧,或者遇到一個從 MarkupExtension 派生的對象元素,則將首先計算所引用的標記延伸(而不是將該擴充作為字串來處理),而且將使用由標記延伸返回的對象。在許多情況下,由標記延伸返回的對象將是對現有對象的引用,或者是一個將計算延遲到運行時的運算式,而不是一個新對象。

如果該屬性 (Property) 是用指定的 TypeConverter 聲明的,或者該屬性 (Property) 的實值型別是用屬性 (Attribute) 化 TypeConverter 聲明的,則該屬性 (Attribute) 的字串值將作為轉換輸入提交到類型轉換器,該轉換器將返回一個新的對象執行個體。

如果沒有 TypeConverter,則將嘗試直接轉換為屬性類型。最後一個層級是直接在基元類型之間轉換,或者在枚舉中檢查名稱(這將返回匹配的值)。

例如,在使用上面所顯示的標記時,可以使用下面的屬性 (Attribute) 文法樣本為 Name 屬性 (Property) 賦予字串值:

Name 屬性是 Button 類的成員表的成員。Button 是用來定義 Name 的 FrameworkElement 類的衍生類別。

屬性值的處理

包含在左引號和右引號之間的字串值是由 XAML 處理器處理的。對於屬性來說,預設處理行為是由基礎 CLR 屬性的類型確定的。如果該屬性 (Property) 是基元類型,則會基於字串到相關基元類型的隱式轉換來賦予屬性 (Attribute) 值。如果該屬性是一個枚舉,則字串會被視為由該枚舉定義的名稱,而且將從枚舉中返回匹配的值。如果該屬性 (Property) 既不是基元類型又不是枚舉,則屬性 (Attribute) 值必須由針對該屬性 (Property) 本身或者目標型別宣告的類型轉換器來處理。類型轉換器必須提供一個能夠接受字串的轉換機制,該轉換機制必鬚生成基礎 CLR 屬性類型的執行個體。還可以通過標記延伸來延遲轉換步驟。

枚舉屬性值

XAML 中的枚舉值由 Enum 結構的本機方法在內部處理。

對於無標誌的枚舉值,本機行為是處理屬性值的字串並將它解析為某個枚舉值。您不必像在代碼中那樣指定格式為枚舉.值 的枚舉,而是僅指定值,枚舉 將從所設定屬性的類型推斷。如果您指定格式為枚舉.值 的屬性,它將無法正確解析。

對於按標誌枚舉,該行為基於 Enum..::.Parse 方法。您可以通過用逗號分隔每個值來為按標誌枚舉指定多個值。但是,您不能合并不按標誌的枚舉值。例如,不能試圖使用逗號文法來建立作用於無標誌枚舉多個條件的 Trigger:

在 WPF 中,能夠支援 XAML 中可設定屬性的按標誌枚舉極為罕見。但是,StyleSimulations 就是這樣的一個枚舉。例如,可以使用逗號分隔的按標誌屬性文法來修改在 Glyphs 類的“Remarks”(備忘)部分中提供的樣本;StyleSimulations = "BoldSimulation" 可能會變成 StyleSimulations = "BoldSimulation,ItalicSimulation"。KeyBinding..::.Modifiers 是另一個屬性,在該屬性中可以指定多個枚舉值。但是,此屬性是一個特例,因為 ModifierKeys 枚舉支援其自身的類型轉換器。修飾符的類型轉換器使用加號 (+) 而不是逗號 (,) 作為分隔字元,因此在標記中支援用更傳統的文法來表示按鍵組合(如“Ctrl+Alt”)。

屬性引用和事件成員名稱引用

在指定屬性 (Attribute) 時,可以引用您已經為包含對象元素執行個體化的 CLR 類型的成員表中存在的任何屬性 (Property) 或事件。

或者,可以獨立於包含對象元素來引用附加屬性或附加事件。

對於可通過預設命名空間訪問的任何對象中的任何事件,還可以通過使用類型名.事件 部分限定名來命名。此文法支援為路由事件附加處理常式,在路由事件中,處理常式旨在處理子項目中的事件路由,但是父元素在其成員表中並不擁有該事件。此文法與附加事件文法相似,但此處的事件不是真正的附加事件。相反,您引用的是具有限定名稱的事件。

屬性 (Property) 名有時作為屬性 (Attribute) 值提供,而不是作為屬性 (Attribute) 名提供,屬性 (Property) 名還可以包括限定符,例如以所有者類型.依賴項屬性名稱 格式指定的屬性。在 XAML 中編寫樣式或模板時,此情況較為常見。以屬性 (Attribute) 值形式提供的屬性 (Property) 名具有不同的處理規則,這些規則由所設定的屬性 (Property) 類型以及某些上下文因素(如樣式或模板是否具有目標類型)來控制。

當屬性 (Attribute) 值描述屬性 (Property) 之間的關係時,也可以使用屬性 (Property) 名。此功能可用於資料繫結和示範圖板目標,而且由 PropertyPath 類及其類型轉換器啟用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.