掌握了C#和C++的程序员学习WPF的时候,首先遇到的麻烦就是XAML(实际上,很长一段时间以后,我发现XAML还是软肋)。

XAML语言和传统的C#和C++编程语言完全不同,这种不同是根植于两种语言的基础的,特别是在C++程序员看来,每次看到那一大串<>就有点晕;另外,XAML语言有一个很麻烦的地方,那就是容易看懂,但是很难记住,对于初学者来说,很多东西几乎就是直接机械记忆,比如点击按钮的响应函数要用这样的形式来写<Button Click="button_click1"/>,而button_click1函数则是放在了XAML对应的cs文件中。上帝保佑,M$一向擅长的用户体验帮了大忙,丰富的输入提示大大减轻了程序员的记忆负担。不过,很多内容还是需要你“见多识广”,换句话说,没办法一口吃个胖子,很多内容在于积累。

闲言少叙,回到XAML语言中,今天就简单记录一下最基础的部分:XAML中的标记扩展,事件处理器,命名空间,注释。

1.标记扩展

简单而言就是用“{}”来封装一堆属性的赋值。比如

<TextBox Text="{Binding ElementName=slider1, Path=Value, Mode=OneWay}" Margin="5">

相当于

<TextBox Margin="5">

  <TextBox.Text>

    <Binding ElementName="slider1" Path="Value" Mode="OneWay"/>

  </TextBox.Text>

</TextBox>

请注意:在{}中赋值没有"",编译器会把{}中的内容直接解析成相应的对象,对象的数据类型名是紧邻左{的字符串。

标记语言可以嵌套,例如Text=“{Binding Source={StaticResource myDataSource}, Path=PersonName}”;标记语言有一些让新入门的使用者头痛的简写语法,比如“{Binding Value, ……}”和“{Binding Path=Value, ……}”是等价的,“{StaticResource myString}”和“{StaticResource ResourceKey=myString,……}”是等价的,前者叫做“固定位置参数(Positional Parameter)”,后者成为“具名参数(Named Parameters)”,固定位置参数实际上就是标记扩展类构造器的参数,其位置由构造器参数列表决定;标记扩展类的类名均以Extension为后缀,在XAML中使用的时候一般都省略不写,比如Text="{x:Static……}"就等价于Text=“{x:StaticExtension……}”(这个也就是知道就行了,谁没事还特地加上Extension?)。

个人认为标记语言写起来很简洁,理解起来很麻烦,使用起来必须“熟能生巧”,换言之,记住就好了。

 

2.事件处理器

.NET事件处理机制里面,如果要处理指定对象的事件,可以为对象的某个事件指定一个能与该事件匹配的成员函数,这个函数就被称为“事件处理器”(Event Handler)。WPF支持同样的时间处理机制,允许使用XAML语言指定对象事件的处理函数,简单而言,就是形如<ClassName EventName="EventHandleName">,其中EventName就是对象ClassName的“事件性属性”,当我们为“事件性属性”赋值的时候,XAML编辑器就会自动为我们生成相应的事件处理器(也就是一个C#写的函数)。一个典型的应用就是button的click事件,形如<Button x:Name="button1" Click="button1_Click" />,Visual Studio .NET编辑器有很棒的辅助功能,能够自动生成对应的函数的定义,该函数(本例中是名为button1_click的函数)会自动出现在XAML文件对应的.cs文件中,形如

private void button1_Click(object sender, RoutedEventArgs e)

{

}

这样就生成了一个事件处理器了,在这个方法里面添加你的代码响应对应的事件吧。 

除了在.cs中生成对应的C#代码,也可以把C#代码搬到xaml文件中,使用x:Code标签和<![CDATA[……]]>即可,比如上面的例子就可以改写如下:

<x:Code>

  <![CDATA[

        private void button1_Click(object sender, RoutedEventArgs e)

        {

        }

  ]]>

</x:Code>

 

3.命名空间

熟悉C#的估计没有不知道这个的吧?XAML也有命名空间,概念和C#中的一样,用法如下:

xmlns:映射名=“clr-namespace:类库中名称空间的名字;assembly=类库文件名”

很眼熟吧,还记得在什么地方看到过?没错,在所有的XAML文件的开头就是这些东西。

有人会觉得有问题:明明我看到的是“http://schemas.microsoft.com/winfx/2006/xaml/presentation”之类的东西啊。其实这个是XAML解析器的硬性编码(hard-coding),意思就是只要看到这些固定的字符,就将一系列的命名空间包含进来。所以不要被这个东西迷惑了,更不要把这这些代码放到浏览器的地址栏中尝试打开网页s。

 

4.注释

 <!-- 我是被注释的内容 -->

这个不多说了,几点注意:只能出现在标签的内容区域,即只能出现在开始标签和结束标签之间;不能注释标签的Attribut;不能嵌套。

 

posted on 2012-02-08 17:13  夜观电脑  阅读(1517)  评论(1编辑  收藏  举报