Xaml

 首先在使用WPF时并不一定要使用Xaml,每一件Xaml能做的事情可以用任何一种.net语言实现,反过来就不行,就好像营养师可以为你调节饮食使得你身体健康间接使你外貌美丽,化妆师可以直接使你外貌美丽但他不能使你身体健康。Xaml扮演的角色是化妆师。但很少有使用WPF而不是用Xaml的情况,因为Xaml有它的好处:
  *用最简单的方式表示用户界面与对象关系
  *使得程序界面与后台逻辑分离。也就是说设计师可以专注于界面设计,程序员专注于后台逻辑的实现
  *可以应用于其他技术,如WF(Windows Workflow Foundation)

  *可以用如XamlPad这样的不需要编译就可以查看结果的软件查看Xaml的效果(如果需要对某个地方做多次修改,每次都要编译才能查看效果是很烦人的)

 

  在Visual Studio中创建一个WPF项目,并在窗口中拖进一个Button控件。就会出现如下Xaml语句:

Code1

  Xaml是基于Xml,所以整体看上去跟Xml很相似。如果用从xml的角度来看的话,存在一个windows的根节点,然后跟节点有4个属性(x:clss,xmlns,xmlns:x,title,height,width),有一个子节点grid,子节点中包含一个Button的节点有4个属性(margin,name,flowdirection)和一个值Button。
  那么以上的东西我们用xml分析了结构,但在Xaml中上面都代表了什么呢?
 

  上面说到Xaml能做的东西用任何一种.net语言都可以实现。如果我们用vb.net在一个窗口中创建一个按钮,首先我们必须引用命名空间,然后创建并实例化命名空间里面的窗口类跟按钮类。然后设置窗口对象和按钮对象的属性。
  Xaml在一开始也是要引用命名空间,vb.net中利用imports关键字,C#用using关键字,Xaml就在根节点中用xml记录节点属性的方式,为根节点的xmlns赋上命名空间的名字。如代码中的:

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

 上面的字符串看起来像一个网址,其实这个网页并不存在,他其实是一个命名空间的名字,只是他的名字比较特别。("http://schemas.microsoft.com/winfx/2006/xaml/presentation")对应.net中的多个命名空间,xaml在引用命名空间的时候通常会对命名空间定义一个标记符(别名)。xmlns:x ,X在Windows根节点内都会代表("http://schemas.microsoft.com/winfx/2006/xaml")命名空间。
  通常第一定义的命名空间成为“主要命名空间”(使用得最多)不带标记符(为了方便啊,使用得最多,每次都要带别名就书写跟可读性就差了)。第二个定义的命名空间为“次要命名空间”带标记符X,这个X是随便写的,不过大家的习惯次要命名空间的标记符都是X(要跟上步伐,每个人都这样咯,我们跟风吧)。

 

  如果有学过ASP.NET的同学应该知道asp.net中网页元素跟程序逻辑是分开在两个文件中,如果新建一个页面输入名字为Index.aspx,Visual Studio会自动生成另一个同名的文件Index.vb或index.cs。当你在设计模式中创建一个按钮然后双击按钮准备输入按钮的单击事件,Visual Studio会切换到源代码模式并打开index.vb。这样就实现了网页设计跟后台逻辑的分离。
  同样是微软的东西,相同之处还是有的。Xaml负责界面设计那么它一定有一种规则使得他跟另一个后台逻辑的文件绑定共同实现一个程序窗口。那么这种规则就是把与一个后台逻辑类的类名赋值改X标记符(相当于"http://schemas.microsoft.com/winfx/2006/xaml"命名空间)里面的class。

 

  属性元素与特性
  在Windows 的节点中title,height,weight就是windows(窗口)元素的特性,因为这些特性源于主要命名空间,所以在赋值这个特性的时候直接使用特性名。
    title=,height=,weight=
  表示Xaml中一个XML元素的特性可以使用属性元素的规则。例如

<Button Name="Button1" FlowDirection="LeftToRight">
<Button.Margin>
93,102,57,70.5
</Button.Margin>
<Button.Content>
Button
</Button.Content>
</Button>

与上面的代码中定义的Button是同等的。Button.Content中的句点是用于区分对象元素与属性元素。以“类型名.属性名”的形式出现,然后属性值就放在对应属性元素的开始于结束标签中。还有一点需要注意的是属性元素没有特性。就是不可能出现<Button.Content ABCD=123>属性值</Button.Content >.

  类型转换器
  它是使得Xaml简洁的功臣之一,在上面的属性元素中无论是位置(Maigin)还是内容(Content)包含的值都没有指定值得类型,我们知道在任何一种.net语言中,对一个对象的属性赋值,赋的值必须符合对象属性的类型。不然就会出错。那么在Xaml中没有指定值的类型他是怎样实现赋值的呢?
  需要说一下的是上面的值既不是String(字符串)也不是Object(对象)。Xaml解析器或编译器会存在能解析并转换这些值得类型转换器,把这个值转换成Button对象所支持的类型。

 

  标记扩展
  它跟类型转换器一样,加强Xaml的表达能力。当转换器不能为你提供一些属性类型的转换(你想为一个属性赋值,但这个值的类型内置的转换器不支持),那么你就需要从其他类中取得这个属性的类型。这就需要用到标记扩展。

<Button Backgroud="{x:Null}" 
        Height
="{x:Static SystemParameters.IconHeight}" 
        Content
="{Binding Path=Height,RelativeSource={RelativeSource Self}}" />

  只要把特性值用花括号({})括起来,Xaml编译器或解析器就会把认做标记扩展,然后从相当的类或对象中获取相应的值。
    *这部分还不是很了解,定个标记。

 

 

------------
  先写这么多吧,明天继续。这章不知道是实在抽象难懂还是我笨,看了两遍才勉强写出上面那些东西。
  在图书馆借的《WPF全视角分析》Xaml那部分我看不下去,在当当网上买了《WPF揭秘》昨天下午收到。然后看了两章。感觉比那本全视角容易懂一点。

  我最怕冷了,在宿舍我都要穿4件衣服。这个冬天要我怎样过啊!!!

posted @ 2009-11-19 21:59  尐傑.net  阅读(661)  评论(0编辑  收藏  举报