我在上一篇博文中說過,XAML是一種基於XML的用來建立和初始化.NET對象的語言。雖然XAML可以在更多的CLR類型中進行運用,但在Silverlight中它是以一種人類可創作的方式來描述UI。
一, 初識XAML:
XAML代碼:
<UserControl x:Class="SilverlightApplication1.MainPage"
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"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<!--http://schemas.microsoft.com/winfx/2006/xaml/presentation:核心Silverlight命名空間
http://schemas.microsoft.com/winfx/2006/xaml:是XAML命名空間
-->
<Grid x:Name="LayoutRoot" Background="White">
<Button
x:Name="button"
Width="200"
Height="25"
Click="button_Click"
>
Click me,baby,one more time!
</Button>
</Grid>
</UserControl>
運行結果,如圖:
與XAML代碼等效的C#代碼:
代碼如下 |
複製代碼 |
partial class MainPage : UserControl//類MainPage從UserControl繼承 { Button button;//聲明一個Button類對象 void InitializeComponent() { //初始化button button = new Button(); button.Width=200; button.Height=25; button.Click+=button_Click;//添加事件 this.AddChild(button);//調用AddChild()方法將button添加到當前對象中 } } |
從以上這個簡單的執行個體中我們可以得出如下兩點認識:
1,通常,一個XAML元素就是一個.NET類名,一個XAML屬性(Attribute)就是一個類的屬性(Property)名或者一個類的事件名,XAML被儘可能地設計成從XML到.NET的直接映
射.這一點認識非常重要.
2,我在上一篇中定義XAML的時候說過,XAML語言是基於XML語言的,所以它的表現形式與XML非常相似.
有了以上兩點認識後,下面我們開始XAML的學習了.
為了方便解釋後面的內容,我在這裡再建立一個基本的XAML例子,作為後面內容的公用執行個體:
代碼如下 |
複製代碼 |
<UserControl x:Class="SilverlightApplication1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <Ellipse Fill="LightBlue"/> <TextBlock> Name:<TextBlock Text="{Binding Name}"/> </TextBlock> </Grid> </UserControl> |
二,命名空間:
當在XAML檔案中使用<TextBlock>元素時,Silverlight解析器會識別出來你想要建立TextBlock類的一個執行個體.然而,它無需知道使用的TextBlock類是什麼的.畢竟,即便Silverlight命名空間只包含一個單獨的名為TextBlock的類,但誰也不敢保證你不會建立一個自訂的同名的類.明確地說,你需要一種方法來指明Silverlight命名空間資訊,從而明確使用元素.這就是為什麼要定義命名空間的原因.
在Silverlight中,通過將XML命名空間映射到Silverlight命名空間來解析類的.這一點的理解很重要.
下面我還是拿上面的例子來講解.
代碼如下 |
複製代碼 |
<UserControl x:Class="SilverlightApplication1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" </UserControl> |
這雷根元素<UserControl>中定義了兩個最基本的命名空間(當然還有其它命名空間後面會介紹).
1,http://schemas.microsoft.com/winfx/2006/xaml/presentation是核心Silverlight命名空間.它包含所有的Silverlight中的類,包括Grid,StackPanel,TextBlock以及
Button,通常,這個命名空間沒有使用命名空間首碼來聲明,因此它就成了整個XAML文檔的預設命名空間,也就是說,除非你特別指明,每一個元素都會被自動放入這個命名空間
中.
2,http://schemas.microsoft.com/winfx/2006/xaml是XAML命名空間.它包含多種XAML功能,可以讓你控制文檔如何被解析.這個命名空間通常會映射到x首碼.
上面兩個命名空間基本上就可以讓你訪問Silverlight元素的核心庫了.不過如果你覺得不夠,你還可以自訂命名空間,下面是自訂命名空間的文法.
文法:
代碼如下 |
複製代碼 |
<UserControl x:Class="SilverlightApplication1.MainPage" xmlns:w="clr-namespace:Widgets;assembly=Widgets" ... |
XML命名空間聲明設定了3方面的資訊:
1,XML命名空間首碼.注意你定義的命名空間首碼不要與其它的命名空間首碼衝突就可以了.
2,.NET命名空間.在此例中.類被放置在Widgets命名空間中.
3,程式集.在此例中,所使用的類是Widgets.dll程式集的一部分.假設你已經在Silverlight應用程式中添加了指向Widgets程式集的引用,它將會被自動包含進最終的XAP包裡.
一旦將.NET命名空間映射到XML命名空間,你就可以在XAML文檔的任何地方使用它.例如,如果Widgets命名空間中包含名為HotButton的控制項,你可以像下面這樣建立執行個體
了.
代碼如下 |
複製代碼 |
<w:HotButton Text="Click me" Click="DoSomething"></w:HotButton> |
三,產生類:
有一個在根項目的x:Class屬性,在這裡再展示一遍:
代碼如下 |
複製代碼 |
<UserControl x:Class="SilverlightApplication1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" </UserControl> |
我分以下幾點來解釋:
1,首碼"x:"是標準XML縮寫,它表示這個特定的屬性是由命名空間中的xmlns:x屬性所指定.
2,對於XAML編譯器來說,x:Class屬性就意味著需要產生基於XAML檔案的類定義,而x:Class屬性就是決定所產生的類名字,並且將它派生自根項目.在這裡,所產生的類名為
MainPage,它的基類為UserControl.
3,你不一定要指定一個x:Class屬性.假如我們忽略這個樣本中的屬性,那麼根對象的類型將是UserControl,而不是產生的MainPage類.不過一般會指定這個屬性.
4,在選擇了產生一個類時,它會提供一個通過XAML描述的簡便方法來建立對象樹.由於我們所產生的每一個MainPage執行個體都將包含一系列由XAML指定的對象,因此我們只需要
使用普通的物件建構文法,如:
代碼如下 |
複製代碼 |
MainPage myMainPage=new MainPage(); |