读书人

WPF学习-系统的学习XAML语法

发布时间: 2012-11-05 09:35:12 作者: rapoo

WPF学习---系统的学习XAML语法

1,XAML文档的树形结构:

UI在用户眼里面是个平面结构。如下图所示,在用户眼里看来,这个界面就是一个窗体里面平铺了4个文本框和一个按钮的界面。

WPF学习-系统的学习XAML语法

在传统的Visual C++、Delphi、Visual Basic6.0和Windows Form程序员的思维里,UI也是一个平面的结构。因此,程序员要做的事情就是根据美工给的给定的UI布局把控件安置在窗体的表面,并用使用长度,宽度和间距把控件对齐。

与传统的设计思维不同,XAML使用树形逻辑结构来描述UI,下面是用来描述界面布局的XAML代码:

[html] view plaincopyprint?
  1. <Window x:Class="WpfApplication2.Window2"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="Window2" Height="331" Width="454">
  5. <StackPanel Height="279" Name="stackPanel1" Width="402" Margin="5" Background="AliceBlue">
  6. <TextBox Height="23" Name="textBox1" Width="260" Margin="5"/>
  7. <TextBox Height="23" Name="textBox2" Width="259" />
  8. <StackPanel Height="100" Name="stackPanel2" Width="273" Orientation="Horizontal">
  9. <TextBox Height="23" Name="textBox3" Width="120" Margin="5"/>
  10. <TextBox Height="23" Name="textBox4" Width="120" Margin="5"/>
  11. </StackPanel>
  12. <Button Height="33" Name="button1" Width="99" Margin="10">
  13. <Image Source="/WpfApplication2;component/Images/track.png" />
  14. </Button>
  15. </StackPanel>
  16. </Window>
因为代码中有许多对Attribute的属性,所以结构看起来并不是那么清晰。如果我们把对Attribute的赋值都去掉,那么上面的代码就显现了它的树形框架结构。

[html] view plaincopyprint?
  1. <Window>
  2. <StackPanel>
  3. <TextBox />
  4. <TextBox />
  5. <StackPanel>
  6. <TextBox />
  7. <TextBox />
  8. </StackPanel>
  9. <Button>
  10. <Image />
  11. </Button>
  12. </StackPanel>
  13. </Window>
如果用一张图来表示上面的那段代码,它会是下面这个样子

WPF学习-系统的学习XAML语法
有意思的是,针对一个“看上去一样”的UI布局,XAML代码不一定是唯一的。拿上面的UI代码布局来说,我们还可以使用不同的XAML代码来描述它。

[html] view plaincopyprint?
  1. <Window x:Class="WpfApplication2.Window3"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="Window3" Height="348" Width="538">
  5. <Grid>
  6. <Grid.ColumnDefinitions>
  7. <ColumnDefinition Width="250*" />
  8. <ColumnDefinition Width="266*" />
  9. </Grid.ColumnDefinitions>
  10. <Grid.RowDefinitions>
  11. <RowDefinition Height="42" />
  12. <RowDefinition Height="48" />
  13. <RowDefinition Height="66" />
  14. <RowDefinition Height="153" />
  15. </Grid.RowDefinitions>
  16. <TextBox HorizontalAlignment="Center" Margin="10,10,0,0" Name="textBox1" VerticalAlignment="Top" Grid.ColumnSpan="2"/>
  17. <TextBox HorizontalAlignment="Center" Margin="10,10,0,0" Name="textBox2" VerticalAlignment="Top" Grid.Row="1" Grid.ColumnSpan="2"/>
  18. <TextBox HorizontalAlignment="Right" Margin="10,10,0,0" Name="textBox3" VerticalAlignment="Top" Grid.Row="2" Grid.Column="0"/>
  19. <TextBox HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox4" VerticalAlignment="Top" Grid.Row="2" Grid.Column="1"/>
  20. <Button HorizontalAlignment="Center" Margin="10,10,0,0" Name="button1" VerticalAlignment="Top" Grid.Row="3" Grid.ColumnSpan="2">
  21. <Image Source="/WpfApplication2;component/Images/track.png" />
  22. </Button>
  23. </Grid>
  24. </Window>
精简后的代码是:

[html] view plaincopyprint?
  1. <Window>
  2. <Grid>
  3. <TextBox />
  4. <TextBox />
  5. <TextBox />
  6. <TextBox />
  7. <Button>
  8. <Image />
  9. </Button>
  10. </Grid>
  11. </Window>
框架变成了如图所示的样子:

WPF学习-系统的学习XAML语法


虽然两段代码对UI的实现方式不同,但是框架都是树形的,以<Window>对象为根节点,一层一层向下包含。这种树形结构对于WPF整个体系都具有非常重要的意义,它不但影响着UI的布局设计,还深刻的影响着WPF的属性(Property)子系统和事件(Event)子系统等方方面面。在实际的编程过程中,我们经常要在这棵树上进行按名称查找元素,获取父/子节点等操作,为了方便操作这棵树,WPF基本类库为程序员准备了VisualTreeHelper和LogicTreeHelper两个助手类(Helper Class),同时还在一些重要的基类里封装了一些专门用于操作这棵树的方法。

你也许可能会问:既然有这么多方法可以实现同一个UI,到底应该选择哪一种方式来实现UI呢?实际上,设计师给出的UI布局是软件的一个静态快照(Static Snap),这个静态快照加上用户有可能动态操作才能够构成选择实现布局形式的完整依据,拿上面两段代码来说,如果你希望用户在改变窗体大小后需要等比例缩小自己内部控件的尺寸,那么你选择第二种,如果只希望控件在界面上做一个简单的排列,第一种足矣。

2,XAML中为对象赋值的方法

XAML是一种声明性语言,XAML会为每一个标签创建一个与之对于的对象,对象创建之后要对它的属性进行必要的初始化之后才有使用意义。因为XAML语言不能够编写程序的运行逻辑,所以一份XAML文档除了使用标签声明对象就是初始化对象属性了。

注意:

XAML中对对象赋值总共有两种方法:

A:使用字符串进行简单赋值。

B:使用属性元素(Property Element)进行复杂赋值。

我用一个<Rectangle>标签的Fill为例来介绍这两种方法:

2.1 使用标签的Attribute为对象属性赋值

前面我们已经知道,一个标签的Attribute有一部分与对象的Property对应,<Rectangle>标签里面的Fill这个Attribute就是这样,他与Rectangle类对象的Fill属性对应,在MSDN文档库里可以查询到,Retangle类的Fill类型是一个Brush。Brush是一个抽象类,凡是已Brush为基类的类都可以成为Fill的属性值。Brush的派生类有很多:

读书人网 >编程

热点推荐