【W(wǎng)PF系列】- XAML語法規(guī)范
一、概述
定義XAML語法術(shù)語是XAML語言規(guī)范中進(jìn)行定義或引用。XAML是基于XML的語言,遵循或擴(kuò)展XML結(jié)構(gòu)規(guī)則。XAML是基于描述XML語言或XML文檔對象模型時常用的術(shù)語。
XAML是一種標(biāo)記語言。CLR是可實現(xiàn)運(yùn)行時語言。XAML不是CRL運(yùn)行一部分。僅是使用于WPF的XAML時實例化運(yùn)行的一種表達(dá)形式。
二、對象元素語法
對象元素語法是 XAML 標(biāo)記語法,通過聲明 XML 元素來實例化 CLR 類或結(jié)構(gòu)。 此語法類似于其他標(biāo)記語言(如 HTML)的元素語法。 對象元素語法以左尖括號 (<) 開頭,后面緊跟進(jìn)行實例化的類或結(jié)構(gòu)的類型名稱。 零個或多個空格可以跟在類型名稱后面,零個或多個屬性也可以在對象元素上聲明,使用一個或多個空格分隔每個屬性名稱=“值”對。對象元素必須滿足一下條件之一:
- 元素和標(biāo)記必須以正斜杠 (/) 結(jié)尾,后面緊跟右尖括號 (>)。
- 開始標(biāo)記必須以右尖括號 (>) 結(jié)尾。 其他對象元素、屬性元素或內(nèi)部文本可以跟在開始標(biāo)記后面。 此處可能包含的確切內(nèi)容通常受元素的對象模型約束。 對象元素的等效結(jié)束標(biāo)記也必須存在,與其他開始和結(jié)束標(biāo)記對進(jìn)行正確的嵌套和平衡。
實例一:
<TextBox Text="TextBox" Width="120"/>
實例二:
<TextBox Text="TextBox" Width="120"></TextBox>
三、特性語法(屬性)
特性語法是 XAML 標(biāo)記語法,它通過對現(xiàn)有對象元素聲明特性來設(shè)置屬性的值。 特性名稱必須與支持相關(guān)對象元素的類的屬性的 CLR 成員名稱匹配。 特性名稱后跟賦值運(yùn)算符 (=)。 特性值必須是括在引號中的字符串。
若要通過特性語法進(jìn)行設(shè)置,屬性必須是公共屬性,并且必須可寫。 后備類型系統(tǒng)中屬性的值必須是值類型,或者必須是在訪問相關(guān)后備類型時可由 XAML 處理器實例化或引用的引用類型。
對于 WPF XAML 事件,作為特性名稱引用的事件必須是公共的,并且具有公共委托。
四、特性值的處理
左和右引號中包含的字符串值由 XAML 處理器進(jìn)行處理。 對于屬性,默認(rèn)處理行為由基礎(chǔ) CLR 屬性的類型確定。
特性值會按此處理順序,使用以下內(nèi)容之一進(jìn)行填充:
- 如果XAML處理器遇到大括號或派生自MarkupExtension的對象元素,則首先計算引用的標(biāo)記擴(kuò)展,而不是將值作為字符串進(jìn)行處理,標(biāo)記擴(kuò)展返回的對象會用作值。 在許多情況下,標(biāo)記擴(kuò)展返回的對象會是對現(xiàn)有對象的引用,或者是將計算延遲到運(yùn)行時的表達(dá)式,不是新實例化的對象。
- 如果使用特性化TypeConverter聲明屬性,或者使用特性化TypeConverter聲明該屬性的值類型,則特性的字符串值會作為轉(zhuǎn)換輸入提交到類型轉(zhuǎn)換器,轉(zhuǎn)換器會返回新的對象實例。
- 如果沒有TypeConverter,則嘗試直接轉(zhuǎn)換為屬性類型。此最終在 XAML 語言基元類型之間對分析器本機(jī)值進(jìn)行直接轉(zhuǎn)換,或者檢查枚舉中命名常量的名稱(分析器隨后會訪問匹配值)。
五、枚舉特性值
XAML 中的枚舉由 XAML 分析器以內(nèi)部方式進(jìn)行處理,枚舉的成員應(yīng)通過指定枚舉命名常量之一的字符串名稱來指定。對于非標(biāo)志枚舉值,本機(jī)行為是處理特性值的字符串并將它解析為枚舉值之一。無需如同在代碼中一樣,以“枚舉.值”格式指定枚舉。 而是僅指定值,枚舉通過所設(shè)置的屬性類型進(jìn)行推斷。 如果以“枚舉.值”形式指定特性,則不會正確進(jìn)行解析。
對于按標(biāo)志枚舉,行為基于 Enum.Parse方法。 可以通過用逗號分隔每個值,為按標(biāo)志枚舉指定多個值。 但是,不能合并不按標(biāo)志的枚舉值。
六、屬性和事件成員名稱引用
指定屬性時,可以引用以針對包含對象元素實例化的 CLR 類型的成員形式而存在的任何屬性或事件?;蛘呖梢砸锚?dú)立于包含對象元素的附加屬性或附件事件。
使用 typeName.event 部分限定名稱對可通過默認(rèn)命名空間訪問的任何對象中的任何事件進(jìn)行命名;此語法支持為路由事件附加處理程序,其中處理程序旨在處理從子元素路由的事件,但父元素在其成員表中也不包含該事件。 此語法類似于附加事件語法,但此處的事件不是真正的附加事件。 而是使用限定名稱引用事件。
七、屬性元素語法
屬性元素語法是一種與元素的基本 XML 語法規(guī)則有一些差異的語法。 在 XML 中,特性的值是事實上的字符串,唯一可能的變化是所使用的字符串編碼格式。 在 XAML 中,可以分配其他對象元素作為屬性的值。 屬性元素語法在默認(rèn)情況下會啟用此功能。 屬性不是在元素標(biāo)記中指定為特性,而是采用 elementTypeName.propertyName 形式,使用開始元素標(biāo)記進(jìn)行指定,在其中指定屬性的值,然后結(jié)束屬性元素。具體而言,語法以左尖括號 (<) 開頭,后面緊跟屬性元素語法包含在其中的類或結(jié)構(gòu)的類型名稱。 緊接著是單個點(diǎn) (.),然后是屬性的名稱,再然后是右尖括號 (>)。 與特性語法一樣,該屬性必須存在于指定類型的已聲明公共成員中。
屬性元素語法實例:
<Button>
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="1">First item</MenuItem>
<MenuItem Header="2">Second item</MenuItem>
</ContextMenu>
</Button.ContextMenu>
Right-click me!
</Button>
八、集合語法
XAML 規(guī)范要求 XAML 處理器實現(xiàn)標(biāo)識值類型為集合的屬性。 .NET 中的常規(guī) XAML 處理器實現(xiàn)基于托管代碼和 CLR,它通過下列方法之一標(biāo)識集合類型:
- 類型實現(xiàn)IList
- 類型實現(xiàn)IDictionary
- 類型派生自Array
如果屬性的類型是集合,則推斷的集合類型不需要在標(biāo)記中指定為對象元素。 相反,旨在成為集合中的項的元素被指定為屬性元素的一個或多個子元素。
<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 內(nèi)容屬性
XAML 內(nèi)容語法是一種僅在指定 ContentPropertyAttribute 作為類聲明一部分的類上啟用的語法。 ContentPropertyAttribute會引用作為該類型元素(包括派生類)的內(nèi)容屬性的屬性名稱。 由 XAML 處理器進(jìn)行處理時,在對象元素的開始標(biāo)記與結(jié)束標(biāo)記之間找到的任何子元素或內(nèi)部文本都會分配給該對象的 XAML 內(nèi)容屬性值。 允許為內(nèi)容屬性指定顯式屬性元素,但此用法通常不會出現(xiàn)在 .NET 參考的 XAML 語法部分中。 顯式/詳細(xì)技術(shù)偶爾對使標(biāo)記清晰或是在標(biāo)記樣式方面有價值,但內(nèi)容屬性的意圖通常是簡化標(biāo)記,以便可以直接嵌套直觀上以父子形式相關(guān)的元素。 按照嚴(yán)格的 XAML 語言定義,元素上其他屬性的屬性元素標(biāo)記不會分配為“內(nèi)容”;它們以前按 XAML 分析器的處理順序進(jìn)行處理,不被視為“內(nèi)容”。
-
XAML 內(nèi)容屬性值必須是連續(xù)的
AML 內(nèi)容屬性的值必須完全在該對象元素的其他任何屬性元素之前或之后指定。 無論 XAML 內(nèi)容屬性的值是指定為字符串還是一個或多個對象,情況都是如此。 例如,以下標(biāo)記不會進(jìn)行分析:
<Button Margin="67,45,202,245">
<Button.Background>Blue</Button.Background>
<Button.FontSize>Bold</Button.FontSize>
<Button.Foreground>#FFFFF5F5</Button.Foreground>
<Button.Content>這是一個有背景的按鈕</Button.Content>
</Button>
十、內(nèi)容屬性和集合語法組合
若要接受多個對象元素作為內(nèi)容,內(nèi)容屬性的類型必須明確為集合類型。 與集合類型的屬性元素語法類似,XAML 處理器必須標(biāo)識屬于集合類型的類型。 如果元素具有 XAML 內(nèi)容屬性,并且 XAML 內(nèi)容屬性的類型是集合,則隱式集合類型不需要在標(biāo)記中指定為對象元素,并且 XAML 內(nèi)容屬性不需要指定為屬性元素。 因此,標(biāo)記中的明顯內(nèi)容模型現(xiàn)在可以將多個子元素分配為內(nèi)容。文章來源:http://www.zghlxwxcb.cn/news/detail-744598.html
<Window x:Class="_010_WPF_Demo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:_010_WPF_Demo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="900">
<Grid >
<StackPanel Width="100" Height="200">
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>Button 3</Button>
</StackPanel>
</Grid>
</Window>
十一、總結(jié)
XAML語法規(guī)范大致有以上幾種常用的方式,在實際應(yīng)用中會根據(jù)不同的場景,選擇恰當(dāng)?shù)姆绞浇M合完成應(yīng)用程序的開發(fā)。文章來源地址http://www.zghlxwxcb.cn/news/detail-744598.html
到了這里,關(guān)于【W(wǎng)PF系列】- XAML語法規(guī)范的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!