1、元素屬性 XAML是一種聲明性語言,XAML編譯器會為每一個標簽創建一個與之對應的對象。對象創建出來之後要對它的屬性進行必要的初始化之後才有使用意義。因為XAML語言不能寫程式運行邏輯,所以一份XAML文檔除了使用標簽聲明對象,另外一個功能就是初始化對象的屬性了。在XAML中為對象屬性賦值共有兩 ...
1、元素屬性
XAML是一種聲明性語言,XAML編譯器會為每一個標簽創建一個與之對應的對象。對象創建出來之後要對它的屬性進行必要的初始化之後才有使用意義。
因為XAML語言不能寫程式運行邏輯,所以一份XAML文檔除了使用標簽聲明對象,另外一個功能就是初始化對象的屬性了。
在XAML中為對象屬性賦值共有兩種方法:
- 使用字元串進行簡單賦值;
- 使用屬性元素進行複雜賦值。
2、使用標簽的Attribute為對象屬性賦值
我們已經知道,標簽中的Attribute裡面有一部分與對象的Property互相呼應。
我們首先學習使用字元串對Attribute進行簡單賦值,將Rectangle填充成單一的顏色。
<Grid> <Rectangle Name="Myrectangle" Width="100" Height="100" Fill="Aqua"></Rectangle> </Grid>
在XAML編譯器中,“Aqua” 這個字元串被翻譯成了一個SolidColorBrush對象並賦值給了Myrectangle對象。翻譯成C#代碼就是:
private void Window_Loaded(object sender, RoutedEventArgs e) { SolidColorBrush colorBrush = new SolidColorBrush(); colorBrush.Color = Colors.Aqua; Myrectangle.Fill = colorBrush; }
3、使用TypeConverter類進行屬性映射
在上面的例子中我們使用Attribute=Value語法賦值時,由於XAML語法限制,Value只能是一個字元串值。那麼就會引發兩個問題:
- 如果一個類能使用XAML語言進行聲明,並允許它的Property與XAML標簽的Attribute互相映射,那麼就需要為這個類的Property準備適當的轉換機制。
- 由於Value是一個字元串,所以其格式複雜程度有限。面對格式複雜的字元串就難以滿足賦值需求。
我們舉一個簡單的慄子來演示第一個問題:下麵的代碼XAML編譯器會給我們提示無法將字元串轉換成Huamn類型。
<Window.Resources> <my:Human x:Key="human" Child="DSA" /> </Window.Resources>
(1)屬性轉換
使用TypeConverter的派生類,在派生類裡面重寫TypeConverter的一些方法最終來解決轉換問題:
- 準備一個我們自定義的類Human。
- 新建一個實現了TypeConverter介面的類。
- 在Human類的首部加上[TypeConverterAttribute(typeof(StringToHumanTypeConverter))]特性。
自定義Human類:
[TypeConverterAttribute(typeof(StringToHumanTypeConverter))] public class Human { public string Name { get; set; } public Human Child { get; set; } }
TypeConverter派生類:
public class StringToHumanTypeConverter : TypeConverter { public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string) { Human human = new Human(); human.Name = value as string; return human; } return base.ConvertFrom(context, culture, value); } }
通過以上操作我們就將普通字元串翻譯成合適類型的值並賦值給元素的屬性。
(2)屬性元素進行複雜賦值
在XAML中,每個子級標簽都是父級標簽內容的一個元素,簡稱父級標簽的一個元素。
屬性元素是指:某個標簽的一個元素對應了該標簽的一個屬性,即屬性元素是以元素的形式表達了一個實例的屬性。
我們使用代碼可以描述為:
下麵給出一個使用屬性元素的簡單的代碼示例:
<Rectangle Name="Myrectangle" Width="100" Height="100" > <Rectangle.Fill> <SolidColorBrush Color="Aqua"/> </Rectangle.Fill> </Rectangle>
(3)使用屬性元素的好處
雖然使用字元串為對象屬性賦值與使用屬性元素為對象屬性賦值相比,屬性元素的代碼會比較冗長,但這僅是相較比較簡單的屬性賦值而言的。遇到屬性複雜的對象時,屬性元素的好處就體現出來了。比如我們使用漸變畫刷填充矩形。
<Rectangle Name="Myrectangle" Width="100" Height="100"> <Rectangle.Fill> <LinearGradientBrush> <LinearGradientBrush.StartPoint> <Point X="0" Y="0"></Point> </LinearGradientBrush.StartPoint> <LinearGradientBrush.EndPoint> <Point X="1" Y="1"></Point> </LinearGradientBrush.EndPoint> <LinearGradientBrush.GradientStops> <GradientStopCollection> <GradientStop Offset="0.2" Color="LightCyan"/> <GradientStop Offset="0.4" Color="AliceBlue"/> <GradientStop Offset="0.7" Color="Blue"/> <GradientStop Offset="0.9" Color="Red"/> </GradientStopCollection> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </Rectangle.Fill> </Rectangle>
XAML代碼效果圖: