我在上一篇博文中说过,XAML是一种基于XML的用来创建和初始化.NET对象的语言。虽然XAML可以在更多的CLR类型中进行运用,但在Silverlight中它是以一种人类可创作的方式来描述UI。
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有一个初步的认识,为后面的学习打下坚实的基础!