Windows Phone開發之路(4) XAML基礎(上)


  我在上一篇博文中說過,XAML是一種基於XML的用來創建和初始化.NET對象的語言。雖然XAML可以在更多的CLR類型中進行運用,但在Silverlight中它是以一種人類可創作的方式來描述UI。

一, 初識XAML:

XAML代碼:

 1 <UserControl x:Class="SilverlightApplication1.MainPage"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d=http://schemas.microsoft.com/expression/blend/2008
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 mc:Ignorable="d"
7 d:DesignHeight="300" d:DesignWidth="400">
8 <!--http://schemas.microsoft.com/winfx/2006/xaml/presentation:核心Silverlight命名空間
9 http://schemas.microsoft.com/winfx/2006/xaml:是XAML命名空間
10 -->

11
12 <Grid x:Name="LayoutRoot" Background="White">
13 <Button
14 x:Name="button"
15 Width="200"
16 Height="25"
17 Click="button_Click"
18 >
19 Click me,baby,one more time!
20 </Button>
21 </Grid>
22 </UserControl>

運行結果,如圖:

與XAML代碼等效的C#代碼:

 1 partial class MainPage : UserControl//類MainPage從UserControl繼承
2 {

3 Button button;//聲明一個Button類對象
4

5 void InitializeComponent()
6 {
7 //初始化button
8 button = new Button();

9 button.Width=200;
10 button.Height=25;
11 button.Click+=button_Click;//添加事件
12

13 this.AddChild(button);//調用AddChild()方法將button添加到當前對象中
14 }

15 }

從以上這個簡單的實例中我們可以得出如下兩點認識:

  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();

  以上就是今天總結的內容,希望通過這一篇的學習能對XAML有一個初步的認識,為后面的學習打下堅實的基礎!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM