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

來源:互聯網
上載者:User

屬性元素文法

屬性元素文法是一種與基本 XML 文法稍有偏離的文法。在 XML 中,屬性值是一個實際的字串,唯一可能的變化是使用除 UTF-8 之外的哪種字串編碼格式。在 XAML 中,可以指定其他對象元素作為屬性值。此功能由屬性元素文法來啟用。不將屬性 (Property) 指定為元素標記中的一個屬性 (Attribute),而是使用元素的開始標記指定格式為元素類型名稱.屬性名稱 的屬性 (Property),再指定屬性 (Property) 值,然後結束屬性元素。

具體而言,該文法以左角括弧 (<) 開頭,其後緊跟包含屬性元素文法的類或結構的類型名稱。類型名稱後面緊跟一個點 (.),再後面是必須在指定類型的成員表中存在的屬性名稱,最後面是一個右角括弧 (>)。要賦給屬性的值包含在相應的屬性元素中。通常,值作為一個或多個對象元素提供,因為將對象指定為值正是屬性元素文法應當實現的方案。最後,必須提供一個等效的結束標記來指定同一個元素類型名稱.屬性名稱 組合,並與其他元素標記對形成正確的嵌套和平衡。例如,下面的屬性元素文法針對的是 Button 的 ContextMenu 屬性。

值也可以作為內部文本提供,但是,只有當指定的屬性類型是基元實值型別(如 String)或者是指定了名稱的枚舉時,才能這樣做。這兩個用法不太常見,因為這兩種情況都還支援屬性文法。用字串填充屬性元素的一個方案是,對於不是 XAML 內容屬性但是仍用於表示 UI 文本的屬性,UI 文本中必須出現特定的空白元素(如分行符號)。屬性 (Attribute) 文法不能保留分行符號,但是屬性 (Property) 元素文法可以保留分行符號,不過前提是用來保留大量空白的功能處於活動狀態.

屬性元素不屬於邏輯樹狀結構,它不是由執行個體支援的元素,而只是一個用來設定屬性的特定文法。

集合類型的屬性元素文法

XAML 規範要求所實現的 XAML 處理器能夠標識實值型別是集合的屬性。WPF 實現基於Managed 程式碼,它的 XAML 處理器通過下列操作之一來標識集合類型:

實現 IList。

實現 IDictionary。

從 Array 派生

如果屬性的類型是集合,則不必在標記中指定所推斷的集合類型。相反,應當成為集合中項的元素將被指定為集合類型屬性元素的一個或多個子項目。在載入每個這樣的項並通過調用隱式集合的 Add 方法將其添加到集合的過程中,會將該項計算為一個對象。例如,Style 的 Triggers 屬性採用專用集合類型 TriggerCollection。但是,在標記中不必執行個體化 TriggerCollection,而是需要在 Style.Triggers 屬性元素中指定一個或多個 Trigger 項作為元素,其中 Trigger(或衍生類別)是一個類型,應當作為隱式強型別 TriggerCollection 的項類型。

屬性可以既是一個集合類型,又是該類型和衍生類別型的 XAML 內容屬性。

隱式集合元素會在邏輯樹狀結構中建立一個成員,即使它在標記中不顯示為元素也是如此。通常,所擁有類型的建構函式針對作為其屬性之一的集合執行執行個體化,這會將該集合添加到樹中。

說明:

由 WPF XAML 處理器執行的集合檢測功能不支援泛型列表和字典介面(IList<(Of <(T>)>) 和 IDictionary<(Of <(TKey, TValue>)>))。但是,可以將 List<(Of <(T>)>) 類用作基類(因為它直接實現 IList),或者將 Dictionary<(Of <(TKey, TValue>)>) 用作基類(因為它直接實現 IDictionary)。

XAML 內容文法

XAML 內容文法僅在將 ContentPropertyAttribute 指定為其類聲明一部分的類上啟用。ContentPropertyAttribute 需要一個按名稱指定屬性的參數,而該屬性名稱被定義為這種類型元素(包括派生的類)的內容屬性。為此指定的屬性是元素的 XAML 內容屬性。在由 XAML 處理器處理時,在元素的開始標記和結束標記之間找到的任何子項目或內部文本將被指定為該 XAML 內容屬性的值。元素的屬性元素標記不按照這種方式賦值;它們是先進行處理,而且不被視為“內容”。

正如對於任何其他屬性一樣,對象的 XAML 內容屬性將屬於特定類型。該類型可以是 Object 類型。該內容屬性的類型可協助定義對象的內容模型。例如,鑒於任何對象都可以變為內容,Object 的類型是鬆散的,但是即使這種鬆散類型也要求內容必須是單個對象。該單個對象可以是集合對象,但是即便如此,也只能將一個這樣的集合對象指定為內容。

特定類型的內容模型在該類型的類頁面上進行描述,或者編寫成類型系列的單獨概念性主題中並與每個相關的類型引用建立連結。

集合類型的內容文法

為了接受多個對象元素(或內部文本)作為內容,內容屬性的類型必須是明確的集合類型。與集合類型的屬性元素文法相似,XAML 處理器必須標識作為集合類型的類型。如果某個元素具有 XAML 內容屬性,則該 XAML 內容屬性的類型是集合。不必在標記中將隱含集合類型指定為對象元素,也不必將 XAML 內容屬性指定為屬性元素。因此,標記中明顯的內容模型現在可以將多個子項目作為指定為內容。下面是 Panel 子類的內容文法。所有的 Panel 衍生類別都建立要成為 Children 的 XAML 內容屬性,這需要一個類型為 UIElementCollection 的值。

請注意,標記中既不需要 Children 的屬性元素也不需要 UIElementCollection 的元素。這是 XAML 的設計特徵,其目的在於,使用直接的父-子項目關係將那些用來定義 UI 的遞迴包含的元素更直觀地表示為嵌套元素樹,而不必對屬性元素標記或集合對象進行外部幹預。實際上,按照設計,UIElementCollection 在標記中不能指定為對象元素。由於 UIElementCollection 唯一的用途就是作為隱式集合,因此它不公開公用的預設建構函式,因此不能執行個體化為對象元素。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.