XAML對象元素語法
1.對象元素語法
使用開閉標簽將對象定義一個XML元素,這種語法與其他標記語言如HTML的元素語法非常相似,在以左右尖括號保衛要設置的類或結構的類型名稱。對象元素可以聲明0個或多個屬性,以一個或多個空格來分割每個“屬性名=值“
對,例如 下面使用對象元素語法設置一個TextBox對象並設置其Content和FontSize屬性和命名空間
<TextBox FontSize="10">這是一個textBox控件</TextBox> <textbox> </textbox> <textbox /> 這個樣才是一個對象
2.屬性語法
屬性語法對於簡單類型的屬性賦值場合非常便利,但是對於一些本身就是復雜類型的屬性來說,使用屬性語法會有些難於理解,甚至難於實現
一個比較單行的復雜屬性是Background屬性,通常使用如下的語法來為UI是對象設置背景色如下
<Button Content="登錄" Background="Red" ></Button>
這裏直接為Background賦一個顏色值,XAML解析器會使用BrushConverter轉換器將這個字符串轉換為一個Brush類的派生對象。在.NET中,Brush類實際上是一個抽象類,因此對於Background屬性
也可以使用漸變畫刷,如果需要為背景設置漸變,使用上面的屬性語法代碼是很困難的,所幸的是XAML也提供了另外一種屬性的方法。
3.屬性元素語法
屬性元素語法允許在元素累不使用”元素名.屬性名“的語法來設置復雜的屬性,類似於一個元素中的子元素一樣。例如 上面設置單色背景的屬性語法,也可以改用屬性元素語法來設置
<Button Content="登錄" > <Button.Background> <SolidColorBrush Color="Red" /> </Button.Background> </Button>
如果使用vs設置屬性元素語法,會發現在<button.Background>屬性元素之間,提供了多種可供設置的屬性看。如果非要走極端也可以這麽寫
<Button Content="登錄" > <Button.Background> <SolidColorBrush> red </SolidColorBrush> </Button.Background> </Button>
標記擴展特性
在一些情況下,屬性的值並不能再編寫代碼時就能夠知道,可能需要在運行時由程序產生,或者由用戶產生。或者說,開發人員希望從一個已經存在的空間的某個值來設置其他空間屬性值。
標記擴展可以使用在內嵌元素標記或者是XAML屬性語法中,對於屬性語法,通常使用大括號包圍其語法。而對於屬性元素語法,標記擴展在外觀上與其他任何用於提供屬性元素之的元素相同,即一個將標記擴展類作為一個元素引用並以尖括號(<>)擴起的
XAML元素聲明。下面使用屬性語法來應用標記擴展,在代碼中將為Button 的前景色職位為SystemColor類中的靜態屬性ActiveCaptionBrush
<Button Content="登錄" Background="{x:Static SystemColors.ActiveBorderBrush}" />
這段代碼中,標記擴展使用{MarkupExtension 派生類 參數}。在本例中標記擴展是一個StaticExtension類。X前綴指示StaticExtencion可以在XAMl命名空間中找到,也有很多標記擴展屬於WPF命名空間,因此沒有X前綴。
使用屬性元素語法
<Button Content="登錄"> <Button.Foreground> <x:Static Member="SystemColors.ActiveCaptionBrush"></x:Static> </Button.Foreground> </Button>
附加屬性
附加屬性是指定義在不同類中的屬性可以被應用到其他的控件。在WPF中,附加屬性常常用來作為布局屬性。
在WPF中,每個控件都有其內在的屬性,比如,一個文本框控件有特定的字體、顏色和文本內容等,但是當將這個控件放到一個容器控件中時,依賴於不同的容器
控件能夠進行一些在影響控件在容器中的特性的屬性設置,這通常通過添加附加屬性來進行設置。
附加屬性使用兩部分的語法表示形式:類型定義.屬性名稱,使用這種命名方式,XAML解析器能夠區別標準屬性與附加屬性。下面演示附加屬性的一個用法
假定想要為StackPanel中的textblock對象設置字體的大小,可以使用下列代碼
<StackPanel TextBlock.FontSize="18"> <TextBlock >這個是一個block控件</TextBlock> <TextBlock FontSize="9">這個是第二個控件</TextBlock> </StackPanel>
以上代碼為Stackpanel指定了一個Textblock.FontSize附加屬性,指定了字體為18,可以看到,如果不單獨指定textblock的字體大小,則會使用Stackpanel中定義的大小
附加屬性其實並不是屬性,他們實際上會被轉換為方法調用,XAMl解析器經調用一組靜態方法,這些方法一DefiningType.SetPropertyName(也就是類型.SET屬性)
的形式進行調用,因此,對於上面XAMl代碼,也可以使用如下的C#程序代碼來設置附加屬性
private void Window_Loaded(object sender, RoutedEventArgs e) { TextBlock.SetFontSize(stackpanel1,40); }
為了在代碼中Stackpanel對象應用附加屬性,在XAMl中需要為其設置Name屬性
XAML對象元素語法