就如同其它的基于XML的标记语言一样,XAML大体上也遵循XML的语法规则。例如每个XAML元素包含一个名称以及一个或多个属性。在XAML中,每个属性都是和某个WPF类的属性相对应的,而且所有的元素名称都和WPF中定义的类名称相匹配。例如<Button>元素就和System.Windows.Controls.Button类对应。
XAML是一个纯粹的标记语言,这也就意味着某个元素要实现一个事件的处理时,需要在该元素中通过特定的属性来指定相应的事件处理方法名,而真正的事件处理逻辑你可以通过C#或者VB.NET语言进行实现,我们是没有办法通过XAML来编写相应的事件处理逻辑的。如果你对ASP.NET技术比较了解的话,那么应该对代码后置这个概念不会陌生。对于一个WPF程序来说,我们也可以像ASP.NET那样采用代码后置模型,将页面和相应的逻辑代码分别存放在不同的文件中,也可以以一种内联的方式将页面和逻辑代码都存放在同一个文件中。一般来说,我们是不推荐采用后面这种方式的,但是如果你要坚持这种实现方式亦无不可,但是最好是采用代码后置的方式将呈现层和应用程序逻辑层分离开来。
下面我们通过一个具体的示例来讲解WPF程序中代码后置方式和内联方式的实现机制,在这个示例中依然是使用Button元素来说明这两种方式的区别和实现过程。下面我们通过如下的XAML代码来声明一个Button元素:
而后我们在单击这个Button按钮时,将触发相应的事件,使得该按钮的宽度和其显示的内容信息将发生改变。对应的事件处理程序代码如下:
我们通过上面的程序清单可以看出,一旦点击了该按钮,就将使得按钮的宽度从50延展到100,而其显示的文本也由"Click Me!"变为"Thank you!"。同时也可以发现我们可以使用C#或者VB.NET自己对XAML元素的各个属性进行操作,这是因为所有XAML元素的属性都是和WPF类的属性戚戚相关的。为此,你不单单可以使用C#来改变Button的背景颜色、高度等属性,甚至还可以像以前的Windows窗体程序那样通过代码来调整Button元素的位置坐标。
如果要以内联的方式进行上述的实现,我们可以为在XAML文件中使用<x:code>元素,并将所有的内联代码都封装在<![CDATA[...]]>标签中,以确保分析器不会对其中的代码进行解析。下面就是上述示例的内联实现方式的代码:
XAML开发人员要注意的一点就是每次声明一个XAML元素时,最好用Name属性为该元素指定一个名称,这样应用程序逻辑开发人员才可以通过代码来访问此元素。这是因为某种类型的元素可能在XAML页面上声明多次,但是如果你不显式地指明各个元素的Name属性,那么我们是无法区分那个是我们想要操作的元素,也就无法通过C#或VB.NET来操作该元素和其中的属性了。
下面是声明一个XAML元素必须遵循的四大原则:
·XAML是大小写区分的,元素和属性的名称必须一个严格区分大小写。例如对于Button元素来说,其在XAML中的声明应该为<Button>,而不是<button>。
·所有的属性值,无论它是什么数据类型,都必须包含在双引号中。
·所有的元素都必须封闭的,也就是说,一个元素必须是自我封闭的,<Button .../>,或者是有一个起始标记和一个结束标记,例如<Button>...</Button>。
·最终的XAML文件也必须是合适的XML文档。
声明一个元素及其相应属性的基本格式如下:
下面是一个简单的用户登陆窗口界面,其对应的代码见程序清单,我们来这验证选这段代码是否遵循了上述的四大原则。请你仔细查看元素声明的大小写是否对应、所有的属性值是否都包含在双引号中、所有的元素标记是否是封闭的以及该XAML文件是否是一个组织良好的XML文档。
为了增加XAML代码的可读性,本章中的所有XAML代码都采用了如上述程序清单所示的格式化风格,这样就算是那些包含嵌套元素的复杂标签,我们也可以一目了然地知道其组织结构。当然上述的格式化风格不是请求的,你可以将一个元素声明代码放在一行中,也可以将它分成多行进行放置,一切都取决于你的喜好。因为XAML在部署前是编译为BAML文件的,所以那些多余的空格对编译器的编译过程没有任何的影响,也就是说不会因为空格的多少而影响编译的性能。但是最好还是采用本章采用的格式化风格,毕竟清晰的代码可读性对于后续的维护和修改来说是非常重要的。
XAML是一个纯粹的标记语言,这也就意味着某个元素要实现一个事件的处理时,需要在该元素中通过特定的属性来指定相应的事件处理方法名,而真正的事件处理逻辑你可以通过C#或者VB.NET语言进行实现,我们是没有办法通过XAML来编写相应的事件处理逻辑的。如果你对ASP.NET技术比较了解的话,那么应该对代码后置这个概念不会陌生。对于一个WPF程序来说,我们也可以像ASP.NET那样采用代码后置模型,将页面和相应的逻辑代码分别存放在不同的文件中,也可以以一种内联的方式将页面和逻辑代码都存放在同一个文件中。一般来说,我们是不推荐采用后面这种方式的,但是如果你要坚持这种实现方式亦无不可,但是最好是采用代码后置的方式将呈现层和应用程序逻辑层分离开来。
下面我们通过一个具体的示例来讲解WPF程序中代码后置方式和内联方式的实现机制,在这个示例中依然是使用Button元素来说明这两种方式的区别和实现过程。下面我们通过如下的XAML代码来声明一个Button元素:
35 <Button 36 OnClick="ButtonClickedHandler" 37 Name="MyButton" 38 Width="50" 39 Content="Click Me!" /> |
而后我们在单击这个Button按钮时,将触发相应的事件,使得该按钮的宽度和其显示的内容信息将发生改变。对应的事件处理程序代码如下:
40 void ButtonClickedHandler(object sender, RoutedEventArgs eventArgs) 41 { 42 MyButton.Width = 100; 43 MyButton.Content = "Thank you!"; 44 } |
我们通过上面的程序清单可以看出,一旦点击了该按钮,就将使得按钮的宽度从50延展到100,而其显示的文本也由"Click Me!"变为"Thank you!"。同时也可以发现我们可以使用C#或者VB.NET自己对XAML元素的各个属性进行操作,这是因为所有XAML元素的属性都是和WPF类的属性戚戚相关的。为此,你不单单可以使用C#来改变Button的背景颜色、高度等属性,甚至还可以像以前的Windows窗体程序那样通过代码来调整Button元素的位置坐标。
如果要以内联的方式进行上述的实现,我们可以为在XAML文件中使用<x:code>元素,并将所有的内联代码都封装在<![CDATA[...]]>标签中,以确保分析器不会对其中的代码进行解析。下面就是上述示例的内联实现方式的代码:
01 <x:Code> 02 <![CDATA[ 03 void ButtonClickedHandler(object sender, RoutedEventArgs eventArgs) 04 { 05 MyButton.Width = 100 ; 06 MyButton.Content = "Thank you! "; 07 } 08 ]]> 09 </x:Code> |
XAML开发人员要注意的一点就是每次声明一个XAML元素时,最好用Name属性为该元素指定一个名称,这样应用程序逻辑开发人员才可以通过代码来访问此元素。这是因为某种类型的元素可能在XAML页面上声明多次,但是如果你不显式地指明各个元素的Name属性,那么我们是无法区分那个是我们想要操作的元素,也就无法通过C#或VB.NET来操作该元素和其中的属性了。
下面是声明一个XAML元素必须遵循的四大原则:
·XAML是大小写区分的,元素和属性的名称必须一个严格区分大小写。例如对于Button元素来说,其在XAML中的声明应该为<Button>,而不是<button>。
·所有的属性值,无论它是什么数据类型,都必须包含在双引号中。
·所有的元素都必须封闭的,也就是说,一个元素必须是自我封闭的,<Button .../>,或者是有一个起始标记和一个结束标记,例如<Button>...</Button>。
·最终的XAML文件也必须是合适的XML文档。
声明一个元素及其相应属性的基本格式如下:
<元素名 属性名="值" 属性名="值" ... /> |
下面是一个简单的用户登陆窗口界面,其对应的代码见程序清单,我们来这验证选这段代码是否遵循了上述的四大原则。请你仔细查看元素声明的大小写是否对应、所有的属性值是否都包含在双引号中、所有的元素标记是否是封闭的以及该XAML文件是否是一个组织良好的XML文档。
01 <StackPanel 02 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 03 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 04 HorizontalAlignment="Left" 05 Margin="10"> 06 <Label 07 Margin="5" 08 Content="Username" /> 09 <TextBox 10 Margin="5" 11 BorderBrush="Blue" 12 BorderThickness="1" 13 Background="AliceBlue" 14 Foreground="Black" 15 Width="200"/> 16 <Label 17 Margin="5" 18 Content="Password" /> 19 <PasswordBox 20 Margin="5" 21 BorderBrush="Blue" 22 BorderThickness="1" 23 Background="AliceBlue" 24 Foreground="Black" 25 Width="200" /> 26 <Button 27 Margin="10" 28 Background="AliceBlue" 29 Foreground="Black" 30 Width="100" 31 Height="20" 32 Content="Submit" /> 33 </StackPanel> |
![]() |
为了增加XAML代码的可读性,本章中的所有XAML代码都采用了如上述程序清单所示的格式化风格,这样就算是那些包含嵌套元素的复杂标签,我们也可以一目了然地知道其组织结构。当然上述的格式化风格不是请求的,你可以将一个元素声明代码放在一行中,也可以将它分成多行进行放置,一切都取决于你的喜好。因为XAML在部署前是编译为BAML文件的,所以那些多余的空格对编译器的编译过程没有任何的影响,也就是说不会因为空格的多少而影响编译的性能。但是最好还是采用本章采用的格式化风格,毕竟清晰的代码可读性对于后续的维护和修改来说是非常重要的。