XAML入门-Silverlight 1.1 In Action

来源:互联网 发布:ubuntu您不是所有者 编辑:程序博客网 时间:2024/05/17 00:52

XAML入门-Silverlight 1.1 In Action

English link:Silverlight 1.1 In Action 第1.3节

中文翻译:jupiter@yeah.net

1.3 XAML

可扩展应用标记语言(XAML)是一种声明式语言,它让我们可以使用XML格式初始化对象。这种格式使我们既可以轻松的查看元素的体系结构,同时又很好的分离了代码和内容。正是因为每个XAML元素都对应于一个.NET类型,才使这一切变为可能。下面的示例是最好的说明:

1.6

1.6展示了与同一段XAML等效的三段代码。请注意XAML代码中的TextBlock元素对应于代码段中的初始化语句;幕后会调用对应的.NET类型的默认构造函数。也是发生在幕后,可执行代码定义在code-behind文件中。

1.3.1 Code-Behind

ASP.NET非常相似,XAML页面支持code-behind页面概念。code-behind页面通过将UI相关的代码放在XAML,将可执行代码放在一个链接源文件中,分离了编码和设计。下面的示例最好的解释了XAML和源代码之间的这种关系。

 

figure 1.7 The relationship between a XAML file and a Code-Behind file within a C# project.

如图1.7所示,XAML代码存储在一个xaml文件中,而code-behind类定义存储在一个.xaml.cs文件中(后缀随着你使用的语言变化而变化)。其实,类定义存储在两个文件中,一个后缀为.xaml.cs,另一个后缀为.xaml.g.cs,它是由Visual Studio自动创建的。虽然图1.7中的InitializeComponent方法定义在.xaml..g.cs文件中,然而我们应该在.xaml.cs文件中编码,正是由于这个原因,我们将主要讨论这个文件。

XAML文件通过x:class特性引用code-behind文件。这个类定义编译后,存储在一个名字为“ClientBin”程序集中,它位于一个相对应用程序的目录中。请注意图1.7中程序集文件的路径由x:Class特性提供。

类定义主要用于处理用由对应的XAML文件定义的户界面触发的事件。如图1.7所示,通过Loaded特性,我们可以在我们的XAML代码中指定事件处理器的名字。当使用这种方法时,编译器假设在code-behind文件中存在一个以此特性值命名的方法。确保方法接受正确个数和类型的参数是我们的责任。

除了处理事件,code-behind文件也用于定义公有属性,这样我们可以在XAML代码中对它们进行设置。在创建自定义控件时经常使用这种技术,我们将在12章讨论它。虽然经常为一个类添加属性,但是向名字空间添加类更为频繁。

1.3.2 名字空间

名字空间提供了一种使用组组织相关对象的方法。这些组,或者名字空间,为我们提供了一种方法来定义编译器如何寻找一个类型。为了指定在哪里查找,我们必须在一个XAML文件的根元素中引用一个名字空间。下面的XAML文件展示了两个名字空间的用法。

example 1.1 A basic XAML file referencing two namespaces.

XAML

<Canvas x:Name="myCanvas"

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Loaded="Page_Loaded"

x:Class="Namespace01.Page;assembly=ClientBin/Namespace01.dll"

Width="640" Height="480"

Background="White">

<TextBlock x:Name="myTextBlock" Text="Hello"

FontFamily="Verdana" FontSize="12"

MouseEnter="TextBlock_MouseHover" />

</Canvas>

如例1.1所示,我们可以在单个XAML文件中引入多个名字空间。当我们引用多个名字空间时,需要注意的是每个名字空间必须有一个唯一的前缀。例如前缀”x”用于关联http://schemas.microsoft.com/winfx/2006/xaml名字空间。同时,http://schemas.microsoft.com/client/2007名字空间没有使用前缀。

我们刚刚提到的这两个名字空间几乎每个Silverlight应用程序都会用到。这些名字空间一般如下定义并暴露一些特征给你的Silverlight应用程序。

l         xmlns=http://schemas.microsoft.com/client/2007这个名字空间提供核心Silverlight元素。由于这个原因,这个名字空间一般省略前缀,这样将它作为此页的默认名字空间。这使得我们不必包含前缀就可以引用这个特定名字空间中的元素。

l         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml” – 这个名字空间提供了所有XAML都通用的功能。重要的是记住,其他技术,例如WPFWF,也利用了XAML,它们都需要访问通用的特征,例如Name, Key, Class属性。

除了这两个普遍使用的名字空间;在Silverlight中,我们可以自由引用其他名字空间包括那些我们自定义程序集中的名字空间。当引用一个程序集时,自动将那个程序集拷贝到你的Silverlight应用程序下的”ClinetBin”子目录。实际上,当你编译Silverlight应用程序时,应用程序本身会被编译到一个程序集中,并放入这个目录。我们稍后将讨论应用程序模型,现在,为了引用这些程序集,我们需要定义一个新的名字空间,它包括一个前缀,一个名字空间和程序集。下面的例子展示了这个概念:

example 1.2 This example references a custom assembly called “MyAssembly.dll” that contains a namespace called “MyNamespace”. In order to access the elements within “MyNamespace”, we have defined the “my” prefix.

XAML

<Canvas x:Name="parentCanvas"

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:my="clr-namespace:MyNamespace;[CA]

assembly=ClientBin/MyAssembly.dll"

Loaded="Page_Loaded"

x:Class="XAML02.Page;assembly=ClientBin/XAML02.dll"

Width="640" Height="480"

Background="White">

<my:MyElement x:Name="myElement1" />

</Canvas>

如示例1.2所示,引用其他元素,包括自定义元素,仅仅需要我们提供一些细节。然而创建自定义空间的细节将在12章讨论。示例1.2也包含一些其它应该探讨的XAML相关概念。其中就有概念无比强大的复合属性(compound property)特征。

1.3.3 复合属性

虽然图1.6中的示例展示了XAML.NET类型,属性之间的关系,但是忽略了属性的一个细节。XAML中的属性可以包含比原生类型更加复杂和详细的元素。例如,下面的XAML类型使用另一种称为LinearGradientBrush.NET对象来定义一个Canvas的背景。

example 1.3 A Canvas with a gradient background.

XAML

<Canvas x:Name="myCanvas"

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Width="640" Height="480">

<Canvas.Background>

<LinearGradientBrush>

<GradientStop Offset="0" Color="White"/>

<GradientStop Offset=".5" Color="Navy"/>

<GradientStop Offset="1" Color="White"/>

</LinearGradientBrush>

</Canvas.Background>

</Canvas>

GradientBrush的概念在第八章中讨论,然而,如你所见,我们在XAML结构内部定义Background元素。这种方法由复合属性的概念而来。

复合属性使我们可以在一个元素内部使用TypeName.PropertyName语法来定义元素内部复杂的条目。这种功能强大的特征使我们可以轻松的查看元素的内部结构。另外,当我们创建控件模板(在第十章讨论)时,它为我们带来了极大的灵活性。

1.3.4 附加属性(Attached Properties)

Attached属性实际上是一个在其它元素中指定的属性,而不是在它(属性)所引用的元素中。虽然这看起来有点多余,但是事实远非如此。你可以轻松的通过一致的TypeName.PropertyName语法辨别一个Attached属性。这些特殊的特性一般用在布局面板(在第三章讨论)环境中。

然而,作为一个例子,让我们假设你需要在Canvas中定义一个Rectangle。这个Rectangle的偏移为,距离Canvas左边10像素,顶部10像素。就像前两个语句所示,subjectRectangle)的位置是相对于父亲(Canvas)的。这样,就像下面这个例子所示,subject附着在父亲上。

example 1.4 An example showing the use of two attached properties in action.

XAML

<Canvas x:Name="parentCanvas"

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Width="640" Height="480" Background="White">

<Rectangle Canvas.Left="10" Canvas.Top="10"

Height="40" Width="120" Fill="Silver" />

</Canvas>

示例1.4使用Canvas.Left Canvas.Top 附加属性定位Canvas中的Rectangle。我们可以清楚的看到,附加属性的设置方法与传统属性一样。

 

 
原创粉丝点击