首页 > 代码库 > 1.4.1.2 用 XAML 描述用户界面
1.4.1.2 用 XAML 描述用户界面
1.4.1.2 用 XAML 描述用户界面
Windows 表现层基础库(WindowsPresentation Foundation,WPF)是用于创建用户界面的 .NET 库,这个库支持声明式编程风格,它将描述用户界面部分与实现命令式程序逻辑的部分分隔开来。使用Windows 表现层基础库的最好办法,是使程序逻辑尽可能小,并尽可能多地以声明式方式创建。
声明式的描述用树状结构表示,其构成的每个对象表示图形用户界面的元素。它可以用 C# 创建,但Windows 表现层基础库还提供更好的方法,使用基于 XML 的语言,称为 XAML。不过,我们会看到在 XAML 和 LINQ 之间存在着很多的相似性。清单 1.5 是 XAML 代码与使用命令式 Windows Forms 库代码的对比,它们实现同样的功能。
Listing 1.5 Creating a UI using thedeclarative and imperative styles (XAML and C#)
<!-- Declarative userinterface in WPF and XAML-->
<CanvasBackground="Black">
<Ellipsex:Name="greenEllipse"Width="75"Height="75"
Canvas.Left="0"Canvas.Top="0"Fill="LightGreen" />
</Canvas>
//Imperative user interface using Windows Forms
protected override voidOnPaint(PaintEventArgs e) {
e.Graphics.FillRectangle(Brushes.Black,ClientRectangle);
e.Graphics.FillEllipse(Brushes.LightGreen, 0,0, 75, 75);
}
确定是什么使第一段代码段更具声明性并不困难。XAML 代码通过组合基元,并指定其属性来描述用户界面,整个代码就是一个表达式,它创建一个黑色画布,包含绿色的椭圆。命令式版本说明了如何绘制用户界面,通过语句序列指定应该执行哪些操作,才能获得所需的图形用户界面。这个示例演示了了两者的区别,声明式风格只要说明干“什么”,而命令式风格必须指定“怎么”干。
在声明性的版本中,我们不需要更多了解底层的技术细节。如果你看这段代码,并不需要知道WPF 是如何表示,并绘制图形用户界面的。而使用 Windows Forms 的代码,可以看到所有的技术细节,(比如,画笔的表示和绘图的顺序)。在清单 1.5 中,XAML 和绘图代码的对应关系是清楚的,我们可以用 WPF 和 XAML 来描述更复杂的程序。让我们看一个示例:
<DoubleAnimation
Storyboard.TargetName="greenEllipse"
Storyboard.TargetProperty="(Canvas.Left)"
From="0.0"To="100.0"Duration="0:0:5" />
这是一个表达式,创建了动画,改变椭圆的 Left 属性(通过名字greenEllipse 指定),其值在 5 秒内从 0 到 100。代码是用 XAML 实现的,我们也可以用 C# 来写,通过显式构造对象树。DoubleAnimation 是一个类,因此可以指定其属性。但是,用XAML 语言来写更具声明性。但是,不管哪种情况,代码能具有声明性,都要感谢 WPF。用传统的命令式代码实现动画相当复杂,必须创建一个计时器,并注册事件处理程序,每隔几毫秒调用一次,来计算椭圆的新位置。
用.NET 进行声明式编程
WPF 和 LINQ 是两个具有声明式风格编程的主流技术,当然还有其他的。LINQ 的目标是简化处理数据的一种通用语言,它借鉴了很多具有声明风格的数据处理语言的思想,例如,在SQL 或 XSLT 中也可以发现声明式的方法。
使用声明式风格的另一领域是在 C# 或 VB.NET 中使用 .NET 特性。特性是用来注解类或其成员的一种方法,指定其如何能在特定情况下使用。比如,在设计器中编辑图形用户界面控件,这就是声明式的,因为,当我们正在处理控制时,说明希望从设计器得到什么,而不是通过写代码,以命令方式来配置设计器的。
到目前为止,我们已经看到了基于声明式风格的几种技术,知道它们能使问题更容易解决。你可能会问自己,我们如何用它来解决自己的问题,在下一节,我们将简单介绍一下第十五章中的一个示例。