XAML 基础

XAML 基础

一旦你理解了下面的规则,XAML标准 是非常简单的。

n  XAML文档中每一个元素都映射一个银光类的实例。元素的名字和类的名字精确匹配。比如,元素<Button>就命令银光生成一个按钮对象。

n  在任何XML文档中,你可以把一个元素嵌套进另一个元素中。同样你可以看到,XAML给每一个类都有如何处理所处环境的弹性。然而嵌套是一种通常被用来表达在另一个词语中有包含意思的方法。如果你发现一个按钮元素在一个栅格元素的里面,你的用户界面可能就有一个在里面包含了按钮的栅格。

n  你可以设置每一个类的属性。然而在有些情况下,类的属性还不足以处理问题。在这种情况下,你将用包含了特殊语法的嵌套标签。

 

     在继续学习之前,看一个裸露出骨架的XAML文档,它表现一个空白页面(Visual Studio自动生成的)。为了便于说明加了行号。

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" d:DesignWidth="640" d:DesignHeight="480">

7

8 <Grid x:Name="LayoutRoot">

9 </Grid>

10 </UserControl>

 

   这个文档包含了两个元素,在顶层有一个UserControl元素,它包裹了一个银光页面的所有内容。还有一个Grid元素,其中可以放置你的元素。在所有的XML文档中,只能有一个顶层元素。在这个例子中,一旦你用</UserControl>标签关闭UserControl元素,你也就关闭了这个文档。后续不能有其他内容。

XAML 命名空间

     当你在一个XAML文件中用了<UserControl>,银光解释器将识别出你想建立一个用户控件类的实例。然而,它不必知道哪一个用户控件被使用。甚至银光命名空间用那个名字只包含一个单独的类,它也不能保证你没有建立一个类似名字的类。很显然,你需要用一个方法来指明银光的命名空间信息以便使用一个元素。

      在银光中,类通过映射XML命名空间转换到了银光的命名空间。在例子显示命名空间被定义为:

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"

     Xmlns属性在XML世界中是一个特殊的属性,它被保留用来声明命名空间。在这一段标记中声明了四个命名空间,它们是被Visual Studio 或者 Expression Blend在每一页中生成的。

■ 注释:

 XML 命名空间用特性来声明。这些特性可以被放置在任何元素的开始标签中。但是规则定义在一个文档中你需要用到的所有命名空间应该在最前面被声明。就像这个例子中一样。一旦命名空间被声明,它可以在这个文档中的任何地方使用。

Silverlight 命名空间的核心

最开始的两个命名空间是最重要的。你需要它们来访问银光运行时的必要部分:

http://schemas.microsoft.com/winfx/2006/xaml is the XAML namespace. It includes

various XAML utility features that allow you to influence how your document is

interpreted. This namespace is mapped to the prefix x. That means you can apply it

by placing the namespace prefix before the name of an XML element or attribute

(as in <x:ElementName> and x:Class="ClassName").

 

n  http://schemas.microsoft.com/winfx/2006/xaml/presentation是银光的核心命名空间。它包括了所有的银光必须的类,包括用户控件和栅格。这个命名空间被声明后就不要需要命名空间的前缀了,所以它成为了所有文档的缺省命名空间。另一方面,所有的元素都被自动放置在这个命名空间中,除非你另外指定。

n  http://schemas.microsoft.com/winfx/2006/xaml XAML的命名空间。它包括了各种XAML有用的特性,它们允许你修改你的文档是如何解释的。这个命名空间映射前缀x,这意味着你可以在一个XML元素或特性前加这个命名空间的前缀(比如在 <x:ElementName> x:Class="ClassName")

   这些命名空间信息允许XAML解释器发现正确的类。比如,当它看到用户控件和栅格元素,它看到它们被放置在缺省的http://schemas.microsoft.com/winfx/2006/xaml/presentation命名空间中,它于是搜索相应的银光命名空间,一直到发现相匹配的类System.Windows.UserControl System.Windows.Controls.Grid

XML 命名空间和SILVERLIGHT 命名空间

XML命名空间的名字并不和单独的银光命名空间相应,相反,所有的银光命名空间共享相同的XML命名空间。有两个理由使XAML的发明者选择这样的设计。根据协定,XML命名空间通常是URIs(就像它们在这一样)。这些URIs看上去好像指出了在网页上的定位,但其实他们不是这样的。URI格式被使用是因为不同的组织不会因为不注意而导致通过同一命名空间生成不同的基于 XML 的语言。因为主机schemas.microsoft.com归微软所有,只有微软可以使用这个XML命名空间的名字。

另一个理由是在XAML中被使用的XML命名空间和银光的命名空间不一一映射的,因为这样会使你的XAML文档变的复杂。如果每一个银光的命名空间都有不同的XML命名空间,你就需要为每一个你使用的控件定义正确的命名空间,这样会导致混乱。相反的,银光的发明者选择映射所有的银光命名空间,包括从用户界面元素到单独的XML命名空间。由于在不同的银光命名空间中工作,不会有两个类共享同一个名字。

设计命名空间

跟在核心命名空间之后的是很多特定命名空间,它们不是必须的:

n  http://schemas.openxmlformats.org/markup-compatibility/2006XAML兼容命名空间。你可以用它告诉XAML解释器那些信息必须处理,那些信息可以忽略。

n  http://schemas.microsoft.com/expression/blend/2008命名空间是为设计XAML保留的,它支持Expression Blend (和现在的 Visual Studio 2010)。它被用于设置初始界面的尺寸。

这两个命名空间被用在一个单行语句中:

6  mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">

设计宽度和高度属性是http://schemas.microsoft.com/expression/blend/2008命名空间的一部分。它告诉设计工具制作一个640×480像素大小的页面。没有这个细节,你将不得不在一个被挤压的设计界面中工作,这样就不能真实的预览你的界面了,或者设定一个写死的尺寸(这是不推荐的,因为这样会妨碍你的页面在运行的时候和浏览器窗口相适应)。

忽略属性是http://schemas.openxmlformats.org/markupcompatibility/2006命名空间的一部分。它告诉XAML设计工具可以安全的忽略文档中有前缀d的部分和被放置在http://schemas.microsoft.com/expression/blend/2008 部分,另一方面,如果XAML解释器不理解DesignWidth DesignHeight的细节,它可以安全的继续运行,因为这不是很严重的问题。

■ 注释:在本书的例子中,你很少看到这两个命名空间,因为他们不是特别的重要。他们仅仅服务于设计工具和XAML阅读器,不是银光的运行时。 I

用户命名空间

在很多情况下,你想控制XAML文件中自己的命名空间。一个最常见的例子是如果你想用自定义的银光控件,这时你需要定义新的XML命名空间前缀和并把它映射到你的组件上。这有你需要的语法:

<UserControl x:Class="SilverlightApplication1.MainPage"

xmlns:w="clr-namespace:Widgets;assembly=WidgetLibrary"

... >

XML命名空间的声明要设置三点信息:

n  XML命名空间前缀:你可以在XAML页面中用命名空间前缀去代指这个命名空间。在这个例子中就是w,你可以选择你自己喜欢的前缀,只要不和另外的命名空间前缀冲突就行。

n  .NET命名空间:在这个例子中,这些类被定位在Widgets命名空间中,如果你有在多个命名空间中使用的类,你可以把他们映射在不同的XML命名空间中或者在同一个XML命名空间里(只要没有冲突的类名)。

n  组件:在这个例子中,类是WidgetLibrary.dll组件的内容(当命名组件是不用包括.dll扩展名)。银光将在你的项目组件放置的XAP压缩包中查找这个组件,

■ 注释:记住,银光使用的是一个精简的CLR版本。由于这个原因,一个银光应用程序不能使用完整的.NET类库。相反,它需要一个银光类库。你可以在Visual Studio中选择银光类库项目模板来建立一个银光类库。

如果你想使用在现有应用中自定义的控件,你可以省略命名空间映射的组件部分,显示如下:

xmlns:w="clr-namespace:Widgets"

一旦你把你的.NET命名空间映射到XML命名空间,你可以在XAML文档中的任何地方使用它。比如,如果Widgets命名空间包含一个控件,名字是HotButton,你可以这样建立一个实例:

<w:HotButton Text="Click Me!" Click="DoSomething"></w:HotButton>

在本书中你将用这个技术控制银光组件和银光工具包中的控件。

代码背后的类:

XAML允许你建设用户界面,但为了制造一个函数的应用,你需要一个连接事件处理的途径,这里就包含了应用程序的代码。XAML有一个简单的使用类的方式如下:

1 <UserControl x:Class="SilverlightApplication1.MainPage"

     XAML命名空间中放置在类属性前的x命名空间前缀意味着这是XAML语言的部分,不是一个特定的银光的成员。事实上,类的属性告诉银光解释器用这个特定的名字去生成一个新的类。这个类继承自用XML元素命名的类。另一方面,这个例子生成了一个用SilverlightProject1.MainPage命名的新类,它继承自UserControl类。这个自动生成的部分被合成到了背后的代码文件中。

通常,每一个XAML文件都有一个对应的用客户端C#写的代码背后的类。Visual StudioMainPage.xaml文件建立的代码背后的类名字是MainPage.xaml.cs。以下是代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

namespace SilverlightApplication1

{

public partial class MainPage : UserControl

{

public MainPage()

{

InitializeComponent();

}

}

}

目前,MainPage类还不包含真实的函数。但是它包含了一个重要的细节—一个缺省的构造器,被称为:InitializeComponent() 。当你建立一个类的实例时,解释器将解析你的标记,生成相应的对象,设置它们的属性,附加你定义的事件处理。

■ 注释: InitializeComponent() 方法在银光中扮演重要角色。因为这个原因你不能删除它。同样,如果你增加了其他的构造器,也要命名为:InitializeComponent()

命名元素

     有一个进一步的细节要讨论。在你的代码背后的类中,你常常想用程序来操控元素。比如,你可能想读或改属性或者在运行时添加或取消事件处理。为了达到这个目的,控件必须包括一个XAML的名字属性。在这个例子中,Grid控件已经包括了这个名字特性,所以你可以操作这个控件。

6 <Grid x:Name="LayoutRoot">

7 </Grid>

    这个名字特性告诉XAML解释器在MainPage类中自动添加一个项。

private System.Windows.Controls.Grid LayoutRoot;

现在你可以用名字LayoutRoot和你页面上的栅格进行交互。

■ 提示:在传统的 Windows Forms 应用中每一个控件都有一个名字。在银光应用中没有这样的要求。如果你不想在代码中和元素交互,你可以从标记中移除它的名字特性,本书的例子中通常省略不用的元素的名字以便标记更加简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值