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

來源:互聯網
上載者:User

在具有內容屬性的對象中混合使用屬性元素和對象元素

XAML 規範聲明 XAML 處理器可以進行如下強制:用來填充某個對象元素中 XAML 內容屬性的對象元素必須是連續的,而且不得混合使用。對於混合使用屬性元素和內容的這一限制是由 WPF XAML 處理器強制的。

可以將子物件元素作為某個對象元素中的第一個直接標記,然後可以引入屬性元素。也可以指定一個或多個屬性元素,接著指定內容,然後指定多個屬性元素。但是,一旦內容後面跟有屬性元素,您就不能進一步引入任何內容,而只能引入其他屬性元素。

這個內容/屬性元素順序要求不適用於用作內容的內部文本。然而,這仍然是使內部文本保持連續的不錯的標記樣式,原因是,如果屬性元素與內部文本交錯分布,則很難直觀地檢測標記中的大量空白。

附加屬性

附加屬性是 XAML 中引入的一個編程概念,藉此,屬性可以由類型擁有和定義,但可以在任何元素上設定。附加屬性所面向的主要方案就是,允許元素樹中的子項目向父元素報告資訊,而不要求使用在所有的元素之間廣泛共用的物件模型。相反,附加屬性可以由任何父元素用來向子項目報告資訊。

附加屬性使用的文法在表面上與屬性元素文法非常相似,因為您還需要指定類型名.屬性名稱 組合。二者有兩個重要的差異:

即使在通過屬性文法設定附加屬性時,也可以使用類型名.屬性名稱 組合。只有附加屬性 (Property) 才要求屬性 (Attribute) 文法中使用限定屬性 (Property) 名。

對於附加屬性還可以使用屬性元素文法。但是,對於典型的屬性元素文法,您指定的類型名 是包含屬性元素的對象元素。如果您引用的是附加屬性,則類型名 是用來定義附加屬性的類,而不是包含對象元素。

附加事件

附加事件是 XAML 中引入的另一個編程概念,事件可以由類型定義,但是處理常式可以附加到任何對象上。用來定義附加事件的類型通常是用來定義服務的靜態類型,這些附加事件有時由用來公開服務的類型中的路由事件別名公開。附加事件的處理常式是通過屬性文法指定的。正如對於附加事件一樣,可以擴充附加事件的屬性文法,以便允許使用類型名.事件名,其中類型名 是為附加事件基礎結構提供 Add 和 Remove 事件處理常式訪問器的類,事件名 是事件名稱。

XML 命名空間

上面的所有文法樣本均未指定預設命名空間以外的命名空間。在典型的 WPF 應用程式中,預設命名空間被指定為 WPF 命名空間。您可以指定預設命名空間以外的命名空間,而且仍使用實質上同類的文法,但是,只要命名了無法在預設命名空間中訪問的類,該類的名稱就必須以用來映射對應 CLR 命名空間的 XML 命名空間的首碼作為開頭。例如, 是一種用來執行個體化 MyElement 類的執行個體的對象元素文法,其中包含該類的 CLR 命名空間(可能還有包含該命名空間的外部程式集)以前映射到 custom 首碼。

標記延伸

XAML 定義了一個標記延伸編程實體,該實體允許從 XAML 處理器對屬性或對象元素的常規處理中進行轉義,將該處理轉給支援類。WPF 對 XAML 處理器的實現將 MarkupExtension 抽象類別用作由 WPF 支援的所有標記延伸的基礎。在使用屬性文法時,用來標識 XAML 處理器的標記延伸的字元是左大括弧 ({),其後是右大括弧 (}) 以外的任何字元。左大括弧後面的第一個字串必須引用用來提供特定擴充行為的類,如果子字串“Extension”是實際類名的一部分,則該引用可以省略這個子字串。該類後面可能會出現一個空格,該空格後面的每個字元都可以由所實現的擴充用作輸入,直到遇到右大括弧。在使用屬性文法時,WPF 中標記延伸的主要用途是提供一種方法來引用其他已經存在的對象,或者將引用轉給將在運行時計算的對象。例如,可以指定用 {Binding} 標記延伸來代替給定的屬性通常將使用的實值型別,從而完成簡單的資料繫結。對於無法以其他方式使用屬性 (Attribute) 文法的屬性 (Property),許多標記延伸都允許使用屬性 (Attribute) 文法。例如,Style 對象是一個相對複雜的參考型別,其中包含幾個其他屬性,每個屬性都還採用 byref 對象(而非基元)。但是樣式通常作為資源來建立,之後將通過請求資源的兩個標記延伸之一來引用。該擴充將對屬性 (Property) 值的計算延遲到資源尋找時,允許在屬性 (Attribute) 文法中提供 Style 屬性 (Property) 的值並採用 Style 類型,如下所示:

My button 

在這裡,StaticResource 用來標識 StaticResourceExtension 類,該類提供標記延伸實現。下一個字串 MyStyle 用作非預設 StaticResourceExtension 建構函式的輸入,在該建構函式中,從擴充字元串提取的參數用來聲明所請求的 ResourceKey。MyStyle 應當是定義為資源的 Style 的 x:Key 屬性 值。StaticResource 標記延伸用法要求使用該資源,在載入時通過靜態資源尋找邏輯來提供 Style 屬性值。

可選的和不建議的 XAML 用法

屬性元素的可選用法

屬性元素的可選用法包括,具體地“拼出”由 XAML 處理器視為隱式的元素內容屬性。例如,當您聲明 Menu 的內容時,可以選擇將 Menu 的 Items 集合顯式聲明為 屬性元素標記,並將每個 MenuItem 放在 中,而不是使用隱式的 XAML 處理器行為(即,Menu 的所有子項目都必須是 MenuItem 而且放在 Items 集合中)。有時,這個可選用法可以協助以可視方式闡明標記中所表示的對象結構。或者,屬性元素的隱式用法有時可以避免使用在技術上具有功能但是在視覺上容易引起混淆(如在屬性值中嵌套標記延伸)的標記。

typeName.memberName 全限定屬性

使用屬性的類型名.成員名 格式實際上比僅僅使用路由事件的情況更為普遍,但是,在其他應用程式中,如果只是為了實現標記樣式和可讀性,則該格式是多餘的,您應當避免使用它。在下面的樣本中,對 Background 屬性的三個引用是完全等效的:

Button.Background 之所以適用,是因為在 Button 上對於該屬性的尋找是成功的(Background 是從 Control 繼承的),而且 Button 是對象元素的類或者是基類。Control.Background 之所以適用,是因為 Control 類實際上定義 Background,而且 Control 是一個 Button 基類。

但是,下面的類型名.成員名 格式樣本並不適用,因此顯示為已注釋掉:

Label 是 Control 的另一個衍生類別,而且,如果在 Label 對象元素中指定了 Label.Background,則該用法將適用。但是,由於 Label 不是 Button 的類或基類,因此指定的 XAML 處理器行為是隨後以附加屬性形式處理 Label.Background。Label.Background 不是附加屬性,因此該用法將失敗。

baseTypeName.memberName 屬性元素

與類型名.成員名 格式如何適用於屬性文法相似,基底類型名稱.成員名 文法適用於屬性元素文法。例如,下面的文法適用:

在這裡,即使屬性元素包含在 Button 中,屬性元素也會以 Control.Background 形式提供。

但是,正如屬性的類型名.成員名 格式一樣,基底類型名稱.成員名 在標記中是很差的樣式,您應當避免將其用於設定樣式。

聯繫我們

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