WPF入门指南一:快速入门

jingtianwc 贡献于2011-03-15

作者 zxt  创建于2007-12-28 13:22:00   修改者i-boch  修改于2008-09-02 02:15:00字数93586

文档摘要:WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。
关键词:

http://tech.it168.com/zt/wpf/index.html WPF入门指南一:快速入门 【IT168技术文档】   摘要:WPF是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。本文旨在通过一些简单的示例,让你对WPF有一个概要的认识。 主要内容 1.概述 2.WPF的组成 3.WPF的编程架构 4.XAML 5.WPF中的控件集 一.概述 WPF (Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。 二.WPF的组成 WPF的构成组件如下所示,其中PresentationFramework、PresentationCore、milcore三部分是WPF的核心组件:    三.WPF的编程架构        WPF整体的编程架构如图2所示,可以看到,它其中包含了文档服务、用户界面服务、多媒体服务以及一些其它的基本服务。在用户界面服务中,提供了应用程序 服务、部署服务、控件集、布局以及数据绑定等;在多媒体服务中可以看到WPF几乎可以处理所有的媒体类型,包括图片、音频、视频、动画、2D、3D、文本 等。 四.XAML 在WPF中提供了两种API,一种是用于普通编程的API,比如我们可以用C#、VB.NET等 语言进行编程,另一种是基于XML的API,称为XAML(Extensible Application Markup Language),引入XAML使得UI代码和应用程序逻辑代码完全分离,它是一种标记语言,支持声明式编程,由于XAML是基于XML的,所以它拥有 XML的所有规则和定义,非常容易进行扩展。看下面两段简单的代码: XAML代码: C#代码: Button btn1 = new Button(); btn1.Content = "This is a button"; btn1.Background = Brushes.Blue; btn1.Foreground = Brushes.Red; 五.WPF控件集   在WPF中,提供了非常丰富的控件集,如表一所示: 分类                                          控件 Editing                                     CheckBox, ComboBox, PasswordBox, RadioButton, RichTextBox, Slider, TextBox List                                         Selection ListBox, ListView, TreeView User Information                 Label, ProgressBar, Popup, ToolTip Action                        Button, ContextMenu, Menu, Separator, StatusBar, Thumb, ToolBar Appearance             Border, BulletDecorator, Decorator, Image, Viewbox Dialog boxes           OpenFileDialog, PrintDialog, SaveFileDialog Containers               Expander, GroupBox, RepeatButton, ScrollBar, ScrollViewer, TabControl Layout                       Canvas, DockPanel, Grid, GridSplitter, Panel, StackPanel, VirtualizingStackPanel, WrapPanel                                   Navigation Frame, Hyperlink Documents       DocumentViewer, FlowDocumentPageViewer, FlowDocumentReader, FlowDocumentScrollViewer 以上只是对WPF作一个概要的介绍,在后面的文章中,我会详细的去讲WPF中一些控件的用法\数据绑定、资源处理、样式与模版、文档编程、多媒体编程等内容。 WPF开发简介 【IT168技术文档】     要赢得世界,必须在恰当的时间做出恰当的事。这一点,微软做到了。历经微软DOS,Win 31, Win95, Win 98, Win 2k, WinXP, 一路走来,一次比一次热闹,一个比一个精彩、炫丽。Vista的宣传更是轰轰烈烈,喧嚣日上。Microsoft总是有能力在恰当的时间制造出意料中的轰 动,Vista一经推出便让IT业界趋之若鹜。     一、掀起你的盖头来,让我看看你的脸——.NET Framework 3.0     与微软对Vista锣鼓宣天的推广相比,对与之相伴的.NET Framework 3.0却显得非常低调。微软没将它作为宣传重点。所有的幕后英雄总是默默无闻。对普通用户而言,他们不关心舞台背后的一切,它们更关心的是前台的表现,是 那种炫丽奢华的感觉。真正热捧幕后英雄的,也是我们这群在幕后默默耕耘的程序员们。我们对.NET Framework 3.0有种自然而然的亲切感,因为我们将在此架构上为Vista编写各种程序。     作为微软精心打造的新一代.NET架构,.NET Framework 3.0在Vista时代担当最主要的应用程序接口。.NET曾被微软寄予厚望和重托,比尔·盖茨先生欲用之来实现一统江湖之志。事实证明,微软对.Net 的推出是成功。越来越多的应用程序开发者已从Win32和JAVA架构转向.NET开发,越来越多的网站开发人员爱上了asp.net。这让微软看到了希 望,他们踌躇满志,他们加紧了对.NET的研发,升级速度越来越快,.NET Framework 3.0就是微软在.NET Framework 2.0后最重要的升级。甚至有人惊呼,我们象刘翔一样地飞奔也跟不上微软的速度!     到了.NET Framework 3.0,.NET令程序员更称心、并逐渐“倾心”。在众多的开发环境,微软的开发系列产品,让它在与其它架构的较量中逐渐抢得上风而独在鳌头。     Vista集成.NET Framework 3.0,可谓珠联璧合。可以这么讲,没有.Net Framework 3.0这个幕后英雄,Vista会黯淡很多。     .NET Framework 3.0(原代号“WinFX”),它构建于.NET Framework 2.0之上,同时新增了四个大组件:Windows Presentation Foundation(WPF),Windows Workflow Foundation(WWF)、Windows Communication Foundation(WCF)和Windows CardSpace,而这些恰是NET Framework 3.0最具价值的部分。     其中,最令人瞩目的是WPF(原来代号为“Avalon”),它是微软全新的图形界面引擎,为各种应用提供统一的界面技术。程序员在WPF的帮助下,要开 发出媲美Mac程序的酷炫界面已不再是遥不可及的奢望。Windows Workflow Foundation用于开发基于工作流的应用程序;Windows Communication Foundation则用于开发面向服务的应用程序,它是新一代通讯和网络开发框架,为不同类型的网络应用程序提供了一个通用的编程模型,尤其是包含其中 的PeerChannel模块,以难以置信的方式消除了开发P2P应用程序的复杂性和困难度;而Windows CardSpace提供数字标志用户控件。如果把这些林林总总小巧精美的产品比做是珍珠的话,那么,需要一根金线将这些珍珠串起来,珍珠才更有价值,珍珠 才熠熠生辉。而串起这颗珍珠的金线,就是.NET Framework 3.0。     二、搭建Vista程序的开发环境     1. 如果你使用的是Vista操作系统,那么,由于Vista已集成了.NET Framework 3.0,所以不必再单独安装.NET Framework 3.0。但是,如果你是Windows XP或Windows 2003下开发,则必须安装.NET Framework 3.0。     2. 要开发Vista应用程序,则必须有Vista SDK开发包的支持。Windows SDK for Windows Vista and .NET Framework 3.0包含了大量库文件、头文件、文档、示例和工具。由于Vista操作系统的推出时间比Visual Studio 2005开发工具要晚,因此,针对Windows Vista开发的Windows SDK和.NET Framework 3.0并未集成到Visual Studio 2005中。因此,必须下载此SDK,个头不小(当前最新版本是1.15GB),下载和安装时需要你足够的耐心和毅力,相信这个对于我们这些一向好脾气的 程序员产不在话下。     3. 安装Visual Studio 2005(中/英文版均可,建议你习惯使用英文版,因为所有版本都是英文版的首先投放市场,而英文版到中文版,现实有三个月以上的时间差,而对于我们这些 母语非英语的开发人员,英语关是一个必须跨越的槛,缘引鲁迅老先生的名言改编一下:世界并没有自己熟悉的路,走得多了,也就熟了路!英文看得多了,自然也 就熟悉了)。     4. 下载并安装Visual Studio 2005 SP1,Visual Studio 2005 SP1 Update for Windows Vista。Visual Studio 2005 SP1修补Visual Studio 2005许多错误,并增强了一些性能,由于该补丁包要对Visual Studio 2005和Vista进行详细检测,安装比较耗时。     5.为了方便程序员开发.NET Framework 3.0下的新型应用,微软还推出了VS 2005 Extensions for .NET F ramework 3.0(Workflow)和VS 2005 Extensions for .NET Framework 3.0(WCF&WPF)扩展组件,为Visual Studio 2005提供开发Windows Workflow Foundation、Windows Communication Foundation和Windows Presentation Foundation类型应用程序的模版。     6. 如果要学WPF,特别建议你安装Expression Blend(目前版本是Expression Blend 2 Agust Preview版)。这样,你可以在vs2005新建一个WPF项目,然后用Blend打开此项目,在Blend中对它进行界面设计和美化等工作,然后再 转到vs2005下进行程序编码(两个程序之间支持来回切换)。 三、WPF简介     Windows Presentation Foundation(WPF)是微软新一代图形系统,运行在.NET Framework 3.0架构下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。基于DirectX 9/10技术的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大改进了传统的2D界面,比如Vista中的半透明效果的窗体等都得益于 WPF。微软还提供了专门的界面开发语言XAML(eXtensible Application Markup Language,可扩展应用程序标记语言),使得界面描述代码和程序代码得以分开,从而提高了开发效率并有利于团队开发。     XAML是微软为构建下一代应用程序界面而创建的一种新的基于XML的描述性语言,它可对WPF程序的所有界面元素进行定制,从而构成具有WPF风格的界 面,并最终形成一个组织良好的XML文档。由于它最新会被编译成.Net后台代码,因此它能够同后台进行逻辑处理的.NET语言如C#、J#、C++、 VB等协同工作,其工作性质类似于ASP.NET中的HTML。同HTML一样,XAML既可以直接编码,也可以由专门的工具生成。目前最好的XAML编 辑器就是上面我建议你安装的Expression Blend了,但你也可以使用Windows SDK for Windows Vista中的XAMLPad,但功能却显得非常简单。     实际上,大多数WPF程序将同时包含XAML代码和程序代码,首先使用XAML定义程序界面,然后再用.NET语言编写相应的逻辑代码。跟ASP.NET 类似,逻辑代码既可以直接嵌入XAML文件中,也可以将它保存为独立的代码文件。尽管XAML并非设计WPF程序所必须,按照传统方式使用程序代码来实现 界面依然有效,但是如果使用XAML,界面设计和逻辑设计可以完全分离,不但使程序的开发和维护更加方便,而且在团队开发中,可以使程序员专注于业务逻辑 的实现,而将界面设计交由专业人员来完成,从而使各类人员在项目中各尽其能各展其长,开发出功能强大、界面一流的WPF程序。 WPF指南之XAML概述 【IT168 技术文档】     在我开始看WPF文档开始的几天里,脑子里形成了一种错误的想法:WPF不就是XAML码?当时的感觉就是郁闷啦,我学习WPF还得弄这个东西。给人的第一感觉就是WPF很复杂。虽然对WPF的熟悉和了解还不是特别多,但现在已经知道这确实是一种错误的想法。     Charles Petzold先生曾有一篇文章介绍了WPF、XAML的一些关系(The Two APIs)。文章中说明了WPF为什么很复杂:因为WPF有两套API,一套用于普通的编码访问(比如C#、VB.NET等其中.NET支持的语言。而另 外一套就是基于XML的API,被称为XAML(Extensible Application Markup Language)。     XAML实现UI代码和应用程序逻辑代码的分离。在.NET 3.0和Windows Vista中,XAML与WPF一起建立整个的UI。由于XAML是基于XML的,所以每个XAML代码都肯定是一个完整的XML文件。XAML继承了 XML所有的定义和规则。XAML与其他XML扩展不同之处就是他所表示的意义。每个XAML元素是一个.NET CLR类。基于XML使得我们非常容易扩展和操作XAML。利用XAML的WPF这种关系,开发人员可以单独的设计漂亮的UI,也许真正的美工会更多的出 现。我们可以把程序逻辑写在单独的文件或者是内联嵌入到XML文件。     在XAML中使用得最多的XML功能应该有三个:命名空间、属性和子元素。     先看一个简单的XAML的例子:     其中的xmlns就是XML中的名字空间,在W3C中xmlns是如下定义的:     XML namespaces provide a simple method for qualifying element and attribute names used in Extensible Markup Language documents by associating them with namespaces identified by URI references.     简单地说就是xmlns提供了一种方法把URI引用的名字空间定义为当前XML文件的元素和属性的默认命名空间。这里表示当前这个XML文档,也就是我们的XAML文件,它的默认的命名空间就是http://schemas.microsoft.com/winfx/2006/xaml/presentation。     然后是属性和子元素,XML对属性的表示除了可以用Property外,还可以用子元素,在XAML中也是如此,看一个简单的例子:      例子当中就使用了属性和子元素两种方式来指定属性。其中的Width是直接用属性表示,Background属性是用子元素表示。在多数时候,但不是所有,你可以自由选择这两种表示方式之一。     XAML被编译为BAML(Binary Application Markup Language)文件。通常,BAML文件比XAML更小,编译后的BAML都是Pre-tokenized的,这样在运行时能更快速的加载、分析 XAML等等。这些BAML文件被以资源的形式嵌入到Assembly当中。同时生成相应的代码(文件名称是**.g.cs或者**.g.vb),这些代 码根据XAML元素分别生成命名的 Attribute字段。以及加载BAML的构造函数。     最后,关于XAML的优点,我附上一点翻译过来的条款,可能更直观。     XAML除了有标记语言、XML的优点外,还有如下一些优点:     用XAML设计UI更简单     XAML比其他的UI设计技术所需编码更少。     XAML设计的UI方便转移、方便在其他环境提交。比如在Web或Windows Client。     用XAML设计动态UI非常容易     XAML给UI设计人员带来新的革命,现在所有的设计人员不再需要.NET开发的知识同样可以设计UI。在不远的将来,终端用户可以看到更漂亮的UI。 WPF指南之WPF的结构 【IT168技术文档】     WPF进入我们的生活已经有一段时间。个人认为在UI的实践中,用户需要的是易于操作的,更加绚丽的界面。这两个应该是最基本、也是最重要的宗旨。而对于 开发人员就是要用最简单的方法开发出尽可能漂亮的界面,并且效率也不能太差。除了在一些Web开发和特殊的应用中,很少有开发组配备单独的美工,至少目前 是这样吧!根据自己目前对WPF的了解程度,感觉WPF在其中某些方面确实有超强的震撼力。     客观上讲,Vista操作系统确实给我们带来了无可比拟的视觉效果。我自己深有体会,在近2个月的时间里每天都是在Vista下的开发,回家后看到XP系统,始终有些不爽的感觉。     WPF可以认为是MS利用原有.NET框架的一些特色,加上DirextX的产物。从下图的WPF组件中,我们可以看出最底层仍然是一些内核API。(以下两张图片都来自互联网。)     其中红色显示的组件是WPF的核心。Milcore是一个和DirectX交互的非托管组件,非托管代码能带给我们更高效的处理,能更好的和 DirextX交互。WPF的所有显示都是由Dirext完成的。milcore中一个非常重要的功能就是Composition引擎,这个引擎对效率的 要求很高,它的具体作用稍后介绍。所以milcore放弃了一些CLR的特征来换取效率。而另外两个红色的组件都是建立在CLR基础之上,利用了.NET 的优势。     至于其中的User32组件有什么作用,偶目前的知道的就是在WPF的某些应用场景中为了某些兼容需要使用User32,其中就有DWM(桌面窗口管理)。DWM的内容又可以写上一大堆,感兴趣的朋友可以看SDK文档。     我们除了关心WPF的基本结构外,更重要的 是WPF提供了什么功能,请看下图:     图中的每个黄色块都是一种媒体类型。这就表示WPF可以处理几乎所有的媒体类型:位图、3D、音频、视频和文本等等。通过WPF,它集成了现在的 GDI/GDI+、D3D/OPENGL以及多媒体的DSHOW等等。所有的东西都是等同对象,不管的3D还是2D,或者文本。     结构图中的Animate块贯串了整个的结构,因为在WPF中我们可以对所有的可视内容进行动画操作。这是非常让人期待的功能。Animate下面我们再 次看到了Composition引擎,前面提到过它是位于milcore组件中。开发过程中,我们的界面元素功能有多种,比如图片,视频等等,最后显示到 窗口的内容可以认为只是一张图片(准确说是Surface)。这个引擎的作用就是合成这些图片和视频元素最后进行提交显示。 WPF的数据处理 【IT168 技术文档】     数据绑定,这是WPF提 供的一个真正的优点。除了可以用在传统的绑定环境中,数据绑定已经被扩展应用到控件属性上。学习应用数据绑定,也能真正的体现XAML的好处。到底什么是 数据绑定呢?也许你从字面上已经理解的很不错了。通过数据绑定,我们在应用程序UI和程序逻辑之间建立了一种联系。正常建立绑定后,在数据的值发生改变 后,绑定到数据的元素将自动更新、体现出数据的变化。     同样,我们先看几个相关的知识点:     1、DataContext属性。设置DataContext属性,其实就是指定数据上下文。那么数据上下文又是什么呢?又是一个新的概念:数据上下文允 许元素从它的父元素继承数据绑定的数据源。很简单,在某个元素的DataContext中指定的值,那么在这个元素的子元素也可以使用。注意,如果我们修 改了FrameworkElement或者FrameworkContentElement元素的DataContext属性,那么元素将不再继承 DataContext值。也就是说新设置的属性值将覆盖父元素的设置。如何设置DataContext属性,稍后说明。     2、数据源的种类。也许,WPF提供的数据绑定只是实现了一项普通的功能而已,但是,WPF中所支持的多种数据源使得它的数据绑定功能将更加强大。现在,WPF支持如下四种绑定源:     (1)、任意的CLR对象:数据源可以是CLR对象的属性、子属性以及Indexers。对于这种类型的绑定源,WPF采用两种方式来获取属性值:A)、 反射(Reflection);B)、CustomTypeDescriptor,如果对象实现了ICustomTypeDescriptor,绑定将使 用这个接口来获取属性值。     (2)、XML结点:数据源可以是XML文件片断。也可以是XMLDataProvider提供的整个XML文件。     (3)、ADO.NET数据表。我对ADO.NET的了解不够,在此不做过多评论。     ( 4)、Dependency对象。绑定源可以是其它DependencyObject的DependencyProperty属性。     3、数据绑定的方式:(1)、OneWay,单一方向的绑定,只有在数据源发生变化后才会更新绑定目标。(2)、TwoWay,双向绑定,绑定的两端任何 一端发生变化,都将通知另一端。(3)、OneTime,只绑定一次。绑定完成后任何一端的变化都不会通知对方。     在上面的第二点我介绍了数据源的种类,注意这里的概念和下面要说明的指定数据源的方式的区别。目前,指定数据源有三种方式,我们可以通过任何一种方式来指定上述的任何一种数据源:     (1)、通过Source标记。我们可以在使用Binding使用Source标记显式指定数据源。     (2)、通过ElementName标记。这个ElementName指定了一个已知的对象名称,将使用它作为绑定数据源。     (3)、通过RelativeRource标记。这个标记将在后面说明ControlTemplate和Style时再进行说明。     现在我们说明了很多和数据源相关的内容。但是再绑定的时候,我们还需要指定绑定对象的属性名称。所以WPT提供了一个Path标记。它被用来指定数据源的属性。也即是数据源将在数据源对象的Path所指定的属性上寻找属性值。   在介绍WPF数据绑定源的种类时,第一种就是任意的CLR对象。这里需要注意的是WPF虽然支持任意的CLR对象,但是一个普通的CLR对象类却不行。我们还需要在CLR对象类上实现一种变化通知机制。     WPF把这种通知机制封装在了INotifyPropertyChanged接口当中。我们的CLR对象类只要实现了这个接口,它就具有了通知客户的能力,通常是在属性改变后通知绑定的目标。     下面是一个简单的例子,实现了一个支持通知功能的Camera类: using System; using System.ComponentModel; using System.Windows.Media.Media3D; namespace LYLTEST { public class Camera : INotifyPropertyChanged { private PerspectiveCamera m_Camera; public event PropertyChangedEventHandler PropertyChanged; public Camera() { m_Camera = new PerspectiveCamera(); } private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } public PerspectiveCamera CameraProp { get { return m_Camera; } set { if (value != m_Camera) { this.m_Camera = value; NotifyPropertyChanged("CameraProp"); } } } } }     这一段代码很简单,首先引入类中使用的INotifyPropertyChanged和PerspectiveCamera需要的名字空间。这里与普通 CLR类的区别在于首先有一个公有的PropertyChangedEventHandler事件类型。然后我们在.NET属性包装CameraProp 判断属性是否发生了变化,如果是,则用当前是属性名称字符串“CameraProp”调用另一个私有函数NotifyPropertyChanged。由 它根据属性的名称构造一个PropertyChangedEventArgs对象,并完成对PropertyChanged的调用。它才是属性变化时真正 应该调用的一个通知事件。     最后一点,如果我们需要通知所以的属性都发生了变化,则将上面的属性字符串“CameraProp”用参数NULL替代即可。   前面讲过,通过实现INotifyPropertyChanged,我们可以改变使任意的CLR对象支持WPF的绑定源。但是, INotifyPropertyChanged通常只应用在单个的类属性上。在现实应用中,我们还会遇到另外一种情况:我们需要监视某一堆的数据是否发生 变化。也就是说我们绑定的数据源不再是一个单独数据对象。比如,绑定源是一个数据表时,我们希望在表中任何一条数据发生变化就能得到通知。(这里暂不考虑 WPF绑定对ADO.NET的支持。)     WPF提供了一个ObservableCollection类,它实现了一个暴露了INotifyPropertyChanged的数据集合。也就是说我 们不需要自己对每个单独的数据实现INotifyPropertyChanged结构。我们先看看如何实现一个简单的绑定数据集合。 namespace NSLYL { public class LYLDataObj { public LYLDataObj(string name, string description) { this.name = name; this.description = description; } public string Name { get { return name; } set { name = value; } } public string Description { get { return description; } set { description = value; } } private string name; private string description; } public class LYLDataObjCol : ObservableCollection { public LYLDataObjCol() { this.Add(new LYLDataObj("Microsot", "Operating System")); this.Add(new LYLDataObj("Google", "Search")); } } } 代码很简单,基本上就是这样的一个模板。然后,我们就可以把LYLDataObjCol绑定到一个需要多项数据的Element之上,比如ListBox、ComboBox等等。    绑定之后,只要我的LYLDataObjCol对象发送了变化,ListBox、ComboBox的数据也会有对应的变化。     到现在,我们已经知道在绑定的时候有两种指定数据源的方式:1、DataContext,关于它我们在这个Post有简单介绍。2、直接用Binding 类的Source属性。那么,我们在使用的时候如何区别呢?首先,Source的优先级比DataContext高,只有Source不存在,或者在当前 Source到不到需要的属性时才会查找DataContext。除此之外,这两者没有真正的区别,只是建议使用Source,它能有助于我们调试应用程 序。因为通过它可以明确的得到Source的信息。而DataContext支持一种继承。可以在父Element指定Source源。这同时也成为了 DataContext的一个优点:如果多个Element需要绑定同一个Source源,那么我们只需要在一个地方指定DataContext,就可以 在其子Element使用。 WPF中的命令简述 【IT168技术文档】      在我们日常的应用程序操作中,经常要处理各种各样的命令和进行相关的事件处理,比如需要复制、粘贴文本框中的内容;上网查看网页时,可能需要返回上一网页 查看相应内容;而当我们播放视频和多媒体时,我们可能要调节音量,快速拖动到我们想看的片段等等。在Winform编程中,我们经常使用各种各样的控件来 解决此类问题,当然我们也必须编写一堆代码来处理各种各样的命令和事件处理。那么,Windows Presentation Foundation (WPF)作为微软新一代图形图像支援系统,它是如何处理这些命令及事件的呢?     在WPF中,许多控件都自动集成了固有的命令集。比如文本框TextBox就提供了复制(Copy),粘贴(Paste),裁切(Cut),撤消(Undo)和重做(Redo)命令等。    WPF提供常用应用程序所用的命令集,常用的命令集包括:ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands和EditingCommands。 ApplicationCommands(应用程序命令): CancelPrint:取消打印 Close:关闭 ContextMenu:上下文菜单 Copy:复制 CorrectionList: Gets the value that represents the Correction List command. Cut:剪切 Delete:删除 Find:查找 Help:帮助 New:新建 NotACommand:不是命令,被忽略 Open:打开 Paste:粘贴 Print:打印 PrintPreview:打印预览 Properties:属性 Redo:重做 Replace:取代 Save:保存 SaveAs:另存为 SelectAll:选择所有的 Stop:停止 Undo:撤消 ComponentCommands(组件命令): ExtendSelection:后接Down/Left/Right/Up, 比如:ExtendSelectionDown(Shift+Down,Extend Selection Down),ExtendSelectionLeft等 Move:后接Down/Left/Right/Up, 如:MoveDown MoveFocus:后接Down/Forward/Back/Up, 如:MoveFocusDown MoveFocusPage:后接Down/Up,如:MoveFocusPageUp MoveTo:后接End/Home/PageDown/PageUp,比如:MoveToP ageDown ScrollByLine ScrollPage:后接Down/Left/Right/Up,比如:ScrollPageLeft SelectTo:End/Home/PageDown/PageUp,比如:SelectToEnd NavigationCommands(导航命令): Browse浏览: 后接Back/Forward/Home/Stop, 比如:BrowseBack 缩放显示:DecreaseZoom, IncreaseZoom, Zoom Favorites(收藏) 页面:FirstPage, LastPage, PreviousPage, NextPage,GoToPage NavigateJournal Refresh(刷新) Search(搜索) MediaCommands(多媒体控制命令): Treble高音:DecreaseTreble,IncreaseTreble Bass低音:BoostBass,DecreaseBass,IncreaseBass Channel频道:ChannelDown,ChannelUp MicrophoneVolume麦克风音量调节:DecreaseMicrophoneVolume,IncreaseMicrophoneVolume,MuteMicrophoneVolume ToggleMicrophoneOnOff:麦克风开关 Volume音量: DecreaseVolume,IncreaseVolume,MuteVolume Rewind, FastForward(回放,快进) Track轨道:PreviousTrack,NextTrack [上一段(节)] Play,Pause,Stop,Record(播放,暂停,停止,录制) TogglePlayPause Select选择 EditingCommands(编辑/排版类命令): Align对齐:AlignCenter,AlignJustify,AlignLeft,AlignRight(居中,撑满,左对齐,右对齐) Backspace退格 TabForward,TabBackward(Tab前缩,Tab向后) FontSize字体大小:DecreaseFontSize,IncreaseFontSize Indentation缩排:DecreaseIndentation, IncreaseIndentation Delete删除: Delete选中部分,DeleteNextWord:删除后一字,DeletePreviousWord:删除前一字 EnterLineBreak:换行 EnterParagraphBreak:换段 CorrectSpellingError/IgnoreSpellingError:纠正/忽略拼写错误 MoveUpByLine,MoveDownByLine: 上/下移一行, MoveUpByPage,Mov eDownByPage: 上/下移一页 MoveUpByParagraph,MoveDownByParagraph: 上/下移一段 MoveLeftByCharacter/MoveRightByCharacter:左/右移一字符 MoveLeftByWord/MoveRightByWord 左/右移一词 MoveToDocumentStart/MoveToDocumentEnd:到文章开头/结尾 MoveToLineStart/MoveToLineEnd:到一行的开头/结尾 SelectUpByLine,SelectDownByLine:向上/下选一行 SelectUpByPage,SelectDownByPage:向上/下选一页 SelectUpByParagraph,SelectDownByParagraph:向上/下选一段 SelectLeftByCharacter,SelectRightByCharacter:向左/右选中一字 SelectLeftByWord,SelectRightByWord:向左/右选中一词 SelectToDocumentStart,SelectToDocumentEnd: 选中到篇头/篇尾 SelectToLineStart/SelectToLineEnd:选中到行首/行尾 ToggleBold, ToggleItalic, ToggleUnderline(加粗,斜体,下划线) ToggleBullets, ToggleNumbering(列表:加点,加数字) ToggleInsert:插入 ToggleSuperscript,ToggleSubscript(上标字,下标字) 先来举一个简单的例子: XAML代码: C#代码: StackPanel mainStackPanel = new StackPanel(); TextBox pasteTextBox = new TextBox(); Menu stackPanelMenu = new Menu(); MenuItem pasteMenuItem = new MenuItem(); stackPanelMenu.Items.Add(pasteMenuItem); mainStackPanel.Children.Add(stackPanelMenu); mainStackPanel.Children.Add(pasteTextBox); pasteMenuItem.Command = ApplicationCommands.Paste; 上面代码演示了将对文本框设置为焦点时,菜单项可用,点击菜单项时,将执行粘贴命令。 下面列出关于Command的四个概念和四个小问题: 1、WPF中Command(命令)的四个概念: (1)命令command:要执行的动作。 (2)命令源command source:发出命令的对象(继承自ICommandSource)。 (3)命令目标command target:执行命令的主体 (4)命令绑定command binding:映射命令逻辑的对象 比 如在上面示例中,粘贴(Paste)就是命令(command), 菜单项(MenuItem)是命令源(command source), 文本框(TextBox)是命令目标对象(command target), 命令绑定到command binding文本框(TextBox)控件上。 提示:WPF中的命令都继承自ICommand接口。ICommand暴露两个方法:Execute方法、 CanExecute方法和一个事件:CanExecuteChanged。 继承自ICommandSource的有:ButtonBase, MenuItem, Hyperlink和InputBinding。 而Button, GridViewColumnHeader,ToggleButton,RepeatButton继承自ButtonBase。 System.Windows.Input.KeyBinding和MouseBinding继承自InputBinding。 2、四个小问题: (1)如何指定Command Sources? XAML:(请将“ApplicationCommands.Properties”换成对应的ApplicationCommands属性值,比如: ApplicationCommands.Copy) 同等的C#代码: StackPanel cmdSourcePanel = new StackPanel(); ContextMenu cmdSourceContextMenu = new ContextMenu(); MenuItem cmdSourceMenuItem = new MenuItem(); cmdSourcePanel.ContextMenu = cmdSourceContextMenu; cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem); cmdSourceMenuItem.Command = ApplicationCommands.Properties;   (2)如何指定快捷键? XAML代码: C#代码: KeyGesture OpenKeyGesture = new KeyGesture( Key.B, ModifierKeys.Control); KeyBinding OpenCmdKeybinding = new KeyBinding(ApplicationCommands.Open,OpenKeyGesture); this.InputBindings.Add(OpenCmdKeybinding); //也可以这样(下面一句与上面两句的效果等同): //ApplicationCommands.Open.InputGestures.Add(OpenKeyGesture); (3)如何Command Binding? XAML代码: C#代码: CommandBinding OpenCmdBinding = new CommandBinding( ApplicationCommands.Open, OpenCmdExecuted, OpenCmdCanExecute); this.CommandBindings.Add(OpenCmdBinding); 1 具体的事件处理: C#代码: void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e) { MessageBox.Show("The command has been invoked."); } void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; } (4)如何设置Command Target并进行绑定Command Binding? XAML代码: C#代码: StackPanel mainStackPanel = new StackPanel(); TextBox mainTextBox= new TextBox(); Menu stackPanelMenu = new Menu(); MenuItem pasteMenuItem = new MenuItem(); stackPanelMenu.Items.Add(pasteMenuItem); mainStackPanel.Children.Add(stackPanelMenu); mainStackPanel.Children.Add(mainTextBox); pasteMenuItem.Command = ApplicationCommands.Paste;   以上例子全是单条命令绑定的情形,事实上,你也可以多个按钮多条命令绑定到同一控件上,比如: 在上面的代码中,我们修改了Button的Template属性,我们定义了一个ControlTemplate,在 ... 之间包含的是模板的视觉树,也就是如何显示控件的外观,我们这里使用了一个Ellipse(椭圆)和一 个TextBlock(文本块)来定义控件的外观。     很容易联想到一个问题:控件(Button)的一些属性,比如高度、宽度、文本等如何在新定义的外观中表现出来呢? 我 们使用TemplateBinding 将控件的属性与新外观中的元素的属性关联起来Width="{TemplateBinding Button.Width}" ,这样我们就使得椭圆的宽度与按钮的宽度绑定在一起而保持一致,同理我们使用Text="{TemplateBinding Button.Content}"将TextBlock的文本与按钮的Content属性绑定在一起。 除了定义控件的默认外观外,也许我们想还定义当外界刺激我们的控件时,控件外观做出相应的变化,这是我们需要触发器。参考以下代码: 在上面的代码中注意到... 之间的部分,我们定义了触发器 ,其表示当我们Button的IsMouseIOver属性变成True时,将使用设置器 来将Button的Foreground属性设置为Red。这里有一个隐含的意思是:当Button的IsMouseIOver属性变成False时,设 置器中设置的属性将回复原值。 你可以粘贴以下代码到XamlPad查看效果: 接下来的一个问题是:如果我要重用我的模板,应该怎么办呢? 你需要将模板定义为资源,其实大多数情况下,我们也是这样做的 参考以下代码: 上面的代码将我们原来的模板定义为窗体范围内的资源,其中TargetType="Button"指示我们的模板作用对象为Button,这样在整个窗体范围内的按钮都可以使用这个模板了,模板的使用方法也很简单: 再来看看外发光效果(辉光效果): 上图: 第一个是对TextBox的做了细微外发光特效处理的显示效果(参数值为:GlowColor="Blue" GlowSize="4" Noise="0.3" Opacity="0.4"); 第二个对TextBox的外发光效果"力度比较大",我们发现效果非常明显(参数值:GlowColor="Blue" GlowSize="30" Noise="1" Opacity="0.4")。 这是相应的XAML代码: WPF中控件与控件值的绑定 【IT168 技术文档】 WPF支持以下几种绑定: (1)控件到控件的绑定 (2)XML数据的绑定(含内联XML数据和外部XML文件数据) (3).Net对象的数据绑定 (4)DataSet,DataTable等数据绑定 下面几篇中陆续说明这几种数据绑定的情况,希望对学习WPF的你有所裨益。 1. 控件到控件的绑定 说明: (1)上面将txtBoxInput输入的文字(Text属性)绑定到了下面的txtBlockOutput的Text属性上。当TextBox中的文字改变时,下面TextBlock显示的文字也跟着改变,实现了数据绑定。 (2)绑定的方法是在TextBlock的Text属性中,使用 为了使XAML的语法更为简洁明了,可以使用“{Binding ElementName=源对象名称, Path=源对象属性值名称}”的方式: 比如: 我们发现,txtBlockOutput的Text属性用“{}”括了起来,里面有Binding ElementName=xxx,Path=xxx之类的语句。注意属性值与属性值之间使用逗号(,)隔开了。这是XAML的语法。 看一下最后的效果图片: WPF中使用XmlDataProvider做控件绑定 本篇将说说如何使用XmlDataProvider作控件绑定,但它使用Source 属性。 对于大多数应用程序,我们希望绑定到XML或 .NET 对象。比如XML文件或者自定义的.Net对象,或者是我们从数据库中取出的相应记录。 XAML 用其 Provider 对象支持该操作。XAML 中内置有两种类型的数据提供程序:ObjectDataProvider 和 XMLDataProvider。其中,ObjectDataProvider 用于绑定到 .NET 对象以及从 .NET 对象绑定;XMLDataProvider 用于绑定到 XML 片段和文档以及从 XML 片段和文档进行绑定。 XMAL文件内部数据的直接绑定: 绿 喜欢的颜色 可以看到,在 StackPanel 的资源( )中,有一个 XMLDataProvider 对象。x:Key 表示 Binding 对象中用来引用它的名称。这里,我们创建了 XML 内联数据(数据使用标签包含起来,关于XData的细节,建议你查查MSDN:ms-help: //MS.LHSMSSDK.1033/MS.LHSNETFX30SDK.1033/wpf_conceptual/html/7ce209c2-621b -4977-b643-565f7e663534.htm,有更详细的说明),用作数据绑定的源。在 ListBox 的 Binding 中,使用FavoriteColors的StaticResource作为Source。如果某个数据源位于 XAML 文档中,我们就要指定该对象是一个静态源(StaticResource),正如这里所看到的一样。最后,我们使用 XPath 语句指定应该使用 XML 文档中的哪个集合来填充 ListBox。 最后的结果: WPF中,如何使用图像API进行绘制而不是XAML? 首先,由于WPF中不象GDI+中有Graphics对象,因此你无法使用Graphics进行绘图了,取而代之的是:DrawingContext;类似地,GDI+中的OnPaint已被OnRender取代。 其次,UIElement有一个OnRendar方法,它的定义是: protected virtual void OnRender ( DrawingContext drawingContext ) 但我们不能直接调用OnRender方法,也不能直接创建DrawingContext实例,但可以利用 DrawingGroup.Open 和DrawingVisual.RenderOpen。 这里举两个例子: (1)自定义绘制Canvas: using System; using System.Collections.Generic; using System.Text; using System.Windows.Controls; using System.Windows.Media; using System.Windows; using System.Globalization; namespace BrawDraw.Com.Test { class CanvasCustomPaint : Canvas { protected override void OnRender(DrawingContext dc) { base.OnRender(dc); //画矩形 dc.DrawRectangle(Brushes.Red, new Pen(Brushes.Blue, 1), new Rect(new Point(20, 20), new Size(100, 100))); //画文字 dc.DrawText(new FormattedText("Hello, World!", CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Arial"), 40, Brushes.Orange), new Point(50,60)); } } } ( 2)保存图片到文件: protected void SavePhoto(string fileName) { DrawingVisual drawingVisual = new DrawingVisual(); DrawingContext drawingContext = drawingVisual.RenderOpen(); // 画矩形 Rect rect = new Rect(new Point(160, 100), new Size(320, 80)); drawingContext.DrawRectangle(Brushes.LightBlue, (Pen)null, rect); // 画文字 drawingContext.DrawText( new FormattedText("Hello, world", CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface("Verdana"), 36, Brushes.Black), new Point(100, 60)); drawingContext.Close(); // 利用RenderTargetBitmap对象,以保存图片 RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)this.Width, (int)this.Height, 96, 96, PixelFormats.Pbgra32); renderBitmap.Render(drawingVisual); // 利用JpegBitmapEncoder,对图像进行编码,以便进行保存 JpegBitmapEncoder encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); // 保存文件 FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite); encoder.Save(fileStream); // 关闭文件流 fileStream.Close(); }   最后附上这里的一段话(http://blogs.msdn.com/timothyc/archive/2006/06/16/634638.aspx),除加重点文字以桔色示凸出外, 以原样提供: Adding seemingly simple tweaks (e.g., clipping, bitmap effects) to our scene causes us to fall back to software, and software rending in WPF is slower than GDI+ software rendering. First, the WPF software rendering code is derived from the GDI+ codebase. There are certain limits to what can be accomplished in hardware, and we have to work around what the hardware vendors give us.  As graphics hardware evolves, those limits are likely to become better over time.  If at least some portion of your scene is rendered in hardware, the cost of rendering is already going to be faster than it was in GDI+.  Finally, we shipped a tool at the PDC called ‘Perforator’ to help identify where software rendering occurs. (注意桔色文字部分)  Net3.0:windows表现层基础类库WPF揭密 【IT168技术文档】      一 WPF会带来什么?      Windows表现层基础类库(WPF) ,曾以Avalon为代号,是.net 框架3.0(曾使用代号WinFX)的图形子系统,与XAML密切相关。在微软下一代WINDOWS操作系统 VISTA 中会预装WPF。WPF也可安装在Windows XP SP2 和 Windows Server 2003操作系统。WPF为构建应用系统提供了一致的编程模型,对用户界面和商业逻辑给予清晰地划分。基于WPF的应用程序可以部署在本地系统或者浏览器 平台。WPF为windows应用程序的视觉效果提供了更丰富的控制、设计和开发等方面支持。WPF整合了一系列的应用服务:用户界面、二维和三维绘图、 固定和适应性文档、矢量图形、光栅图形、动画、数据绑定、音频和视频。     WPF/E是WPF的子集,代表“Windows表现层基础类库无处不在的意思”。WPF/E基于XAML和Javascript技术,构成了WPF移动 版本的核心。WPF/E不提供3D特性,但是包括了XPS(XML文档规范)、矢量绘图和硬件加速等功能。 二 WPF的主要特性      以下是WPF的主要特性:      图形服务      所有的图形(包括桌面的窗口等对象)都将通过Direct3D渲染,旨在提供统一的图形显示通道,以实现高级的图形表现效果。           凭借Direct3D渲染图形的好处是,操作系统可以将图形处理任务委托给计算机显示卡上的图形处理芯片,以减轻CPU的负担。 WPF支持任意比例无损缩放的矢量化图形,支持在2D应用程序中进行3D模型的渲染和交互操作。      WPF 除了构建传统的独立运行桌面应用程序,也支持基于XAML技术的浏览器应用(XBAP)。两种类型应用的编程模型很相似。桌面应用程序是可信度最高,采用 ClickOnce或MSI等软件安装在本地计算机的应用程序,对计算机资源拥有完全的访问权限。为了保护计算机免受恶意软件的攻击,XBAP应用只能在 一块由系统专门划分的部分信任沙箱内运行,不能访问计算机的全部资源,也不能使用WPF的全部功能。 用户从网页内XBAP类型应用没有安全或安装方面的提示),反之亦然。XBAP应用虽然看起来像是在浏览器内运行,实质上是创建了另一个进程。       互操作性      WPF提供了同Win32的互操作性。通过嵌入模式,可以在Win32 代码中使用WPF,也可在WPF中使用Win32 代码。同Windows 窗体的互操作可通过ElementHost类和WindowsFormsHost类来实现。 媒体服务      WPF 为二维图形提供了基本几何元素,以及一整套画刷、画笔、几何体和变形等工具。WPF的三维特性局限于Direct3D现有的功能。然而,WPF提供了与用 户界面、文档和媒体介质等的紧密集成。这使得三维界面、三维文档、三维媒体成为可能。    WPF 支持大多数通用图像格式,以及WMV, MPEG and AVI等视频格式。WPF支持时基动画而不是桢动画,从而使动画的播放速度不受系统性能的影响。WPF使用ClearType技术实现文本渲染。 ClearType提供了次像素级定位、自然步幅、纵向反锯齿等特性。WPF同时支持OpenType字体特性。      数据绑定      WPF 内置了一系列数据服务,使得开发人员可以在应用程序之间自如地绑定和操纵数据。WPF提供三种数据绑定方式: 一次性:客户端忽略服务器端的数据更新的情况n 单向性:客户端对服务器端的数据有只读权限的情况n 双向性:客户端对服务器端的数据拥有读写权限的情况 n     数据绑定不依赖于数据表现。WPF提供数据模板用来控制数据的表现。      用户界面      WPF内置一系列控件:按钮、菜单、列表框等。      WPF提出了一个功能强大的概念:将控件的逻辑层和表现层分离。通过重载控件的模板就可彻底改变其外观。控件可包容任何其它控件,从而通过组合实现无限的控制功能。      图像      开发人员使用WPF的Windows图像组件,可以针对特殊的图像文件格式或者特殊的位图效果以及图像元文件进行图像编码。      文字      WPF包括了一些GDI中没有提供的文字渲染特性。首次面向开发人员提供了OpenType 的Windows编程接口,支持OpenType、TrueType和TrueType CFF字体。内置了文字阴影和模糊效果,而像反射等其它效果则很容易实现。      WPF对于OpenType的支持包括: 连字符:老式的数字(例如:数字的部分比划位于文本基线以下)n 变体字n 分数n 上标和下标n 小体大写字母 n     WPF提供的其他排版特性还包括行级别对齐、注音字母等。      WPF 的文本渲染采用了ClearType技术。ClearType为文本渲染提供了硬件加速功能,可以将预渲染的文本在显示内存中进行缓存,具体的支持范围则 取决于显卡的性能。支持DirectX 10.0的显卡能够将文本字形预先缓存在显示内存内,然后全部在硬件上进行字形组合(将字形按照正确的顺序组合起来,并且填充适宜的空格)、透明混合(反 锯齿应用)、RGB混合(ClearType的次像素级颜色运算)等操作。这意味着只需将每种字体的原始文本字形一次性地保存在显存中(微软估计每种字体 需占2兆显存),其它像在图像和视频上叠加反锯齿文字等操作也不占用CPU的计算资源。支持DirectX 9.0的显卡仅能将透明混合处理过的文本字形缓存在显存区域,从而需要CPU进行字形组合和透明混合等计算,然后将计算结果输送到显卡。缓存这些局部渲染 处理过的字形则需更多的显示内存(微软估计每种字体约需5兆显存)。不支持DirectX 9.0的显卡则不能对文本渲染操作进行硬件加速。      WPF支持动画文字,涉及到的技术包括字形动画,以及实时改变文本的位置、尺寸、颜色和透明度等。 三 XAML与开发工具      关于XAML      由于标记语言在WEB开发中的成功应用,WPF引进了一种基于XML的全新语言XAML—— “扩展应用标记语言”。XAML旨在提供更快速开发应用程序用户界面的方式,利用XAML设计者和开发者之间可以更好地协作。      使用XAML开发用户界面可实现模型和视图的分离,这被认为是优秀的软件架构原则。XAML中的每一项元素,映射为底层API的一个类,元素的属性设置为 实例类的属性。WPF中所有的元素都可以使用.NET 语言(C#, VB.net等)编码。XAML代码最终编译成托管程序集。这意味着使用XAML开发不会造成任何性能损失。 PowerPoint和Word等多数应用程序都将支持以XAML格式输出。      XAML有几个子集: XAML-P —— XAML描述,汇集了WPF 1.0所有元素n XPS —— XML文档规范, 是XAML-P的子集,代表固定格式文档,用于Vista打印子系统的联机文档格式。 n     工具      有几个beta版的工具可用于基于WPF应用的开发。 微软开发的Cider面向开发人员,作为Visual Studio 2005设计器的一个插件提供。n 微软的Expression Interactive Designer面向设计人员,提供了为WPF应用创建二维和三维图形、文本、表单等内容的画布。可将结果以XAML格式输出到其它工具中。n 微软的Expression Graphic Designer 用于创建位图和二维图形。n Electric Rain ZAM 3D 提供三维模型交互设计工具,以及XAML输出。n Mobiform Aurora 可用于创建WPF用户界面。 n     WPF/E      WPF/E为Windows Vista之外的平台提供视频硬件加速、矢量图形、动画等WPF子集特性,是对WPF特性的跨平台扩展。值得一提的是,WPF/E将以插件的方式对 Windows XP 、Windows 2000、Mozilla Firefox、Apple Safari、Linux以及移动设备等提供支持。这些扩展组件使得浏览器以及其它应用系统充分利用WPF/E强大的图形处理能力。IE 将对WPF提供本地化支持,并对先前的版本提供WPF/E的支持。      WPF/E 与XAML协同运行,并将在脚本化方面与Javascript互相调用,在以后推出的公共语言运行时版本则可直接执行VB.Net 和C#代码。 剖析微软WPF展示层技术将带给我们什么? 【IT168 分析评论】     微软在TechEd 2005时就已经发表.NET Framework 3.0,整体架构堆栈是在原有的.NET Framework 2.0上,附加4种新技术:革新使用者体验的Windows Presentation Foundation(WPF)、高安全性通讯的Windows Communication Foundation(WCF)、塑造商业流程范围的Windows Workflow Foundation(WF)以及Windows CardSpace等。今年TechEd 2006上,微软接连2场议程探讨WPF展示层技术(其它技术仅有单场议程)。     以往程序设计师并不重视展示层技术,况且,Adobe比微软更早提出所谓的使用者体验。有趣的是,第一场次的讲师曹祖圣于「Windows Presentation Foundation建立新一代的Windows与Web应用程序」的议程中,提出外号「Flash Killer」的接口设计工具:EID(Expression Interactive Designer)。第二场次的讲师彭靖灏,虽然是从「以Windows Presentation Foundation建立丰富的使用者操作经验」为标题,却在后半段议程中提到「使用者经验模型」,彰显出使用者经验将决定应用程序操作接口,取代程序逻 辑导向的时代,更强化WPF的诉求。     整体而言,WPF并非如字面上意义所陈述,仅在于可视化展现而已,微软藉由2场议程,强化WPF技术所要揭露的精神:融合Windows-based与 Web-based应用程序设计,并将系结数据显示于应用程序的可视化组件中 。     Windows Presentation Foundation用途在于提供多样化媒体、使用者接口与文件等解决方案,后续文章将撷取相关议题成为报导主轴。     WPF精神:宣告式程序设计     就使用者接口而言,WPF既然是为了使设计师可以采用相同逻辑设计Windows-based与Web-based应用程序,但以往程序常区分为操作接口 (或称为Markup)以及逻辑(Code),并分属画面设计人员与程序设计师两种不同角色负责处理。此外,设计师还必须为程序接口撰写大量的程序代码, 藉以控制窗口上的对象。WPF不仅为画面简洁易懂,更延用一贯的宣告式程序设计,让设计师只要设定参数即可完成对象控制。曹祖圣风趣地说到:「我怀疑程序 设计师是否还有存在的必要?」。     从微软为WPF所提的架构堆栈上可知,WPF底层以Windows Vista操作系统为主,接下来是Windows Vista Display Driver Model,并采用DirectX绘图引擎,特别是Composite Engine,负责2D与3D绘图处理,包括材质、光源等,除了达到宣告式程序设计的目标外,其余3个目标在于整合操作系统、采用向量式的使用者接口 (UI)组合引擎、统一使用者接口、文件与媒体的程序设计方式、部署更简单等。      外号「Flash Killer」的接口设计工具:EID     另一个与使用者接口设计相关则是WPF技术中,用于实作接口设计工具:EID。虽然议程中曹祖圣简短地展示此工具,在简报文件中,表明EID可以产生 XAML程序代码,同时也是Visual Studio 2005原生支持的使用者接口格式,使得接口设计师可与程序设计师沟通,但他语出惊人地说到,此工具外号「Flash Killer」。     此工具是否真如其名,尚未有定论,但在现场展示过程中,我们可发现此工具与早期的Flash开发工具极相似,连时间轴(Timeline)的位置也相同,当图形依时间轴产生动态效果时,简直与Flash如出一辙。     2D绘图利器:笔刷功能     虽然WPF在多样化媒体处理上,无论是2D或3D绘图,以及影片处理等,仍急起直追着Flash技术,但至少在2D绘图上已经为设计师提供许多更便利的新功能,例如Visual Brush等笔刷(Brush)。     简单地说,设计师可以将屏幕上某个画面当成笔刷,刷到另一个平面,或当成材质贴到另一个3D平面上。对纯粹绘图工具而言,笔刷是很基本的功能,但在窗口设 计上,能不必经由复杂的程序设计产生这样的特效,实属2D绘图上的利器。议程中,讲师打趣地说着,这并非他的专长,「通常外包给画面设计人员,还是写程序 比较好赚。」学员或许可以听出WPF在2D绘图上将更为便利。 备受瞩目的XPS文件技术     WPF另一个引人注目的革命便是文件技术。微软在下一代文件格式,都将透过Packing技术封装成ZIP档,但使用者可采用其它扩展名。学员从这场议程 中将了解到,微软对XPS文件技术有着更大的野心,例如:除了直接存取XPS(XML Paper Specification,XML文件规格书)或Office 2007文件,企业用户将可以建立自订的档案格式,甚至开发文件管理解决方案。     虽然Office在办公室应用软件上的市场占有率高达90%以上,使得某些应用环境中甚至采用DOC档作为文件格式的交换标准,例如政府公文,差别只是文 件内容而已。新一代的XPS文件技术可以藉由XPS文件档案格式,由使用者自订文件格式。现场的学员从XPS文件技术堆栈简报中,清楚地看到「Open XML Formats」,这是微软为解决办公室应用软件市场中对专属档案格式的疑虑,而推出的技术,特别是长期保存的文件。或者说,这也是微软为了在开放源码角 力时的主力。     可视化呈现动态数据     WPF同时更新数据系结(Data Binding)功能,与ASP.NET相较丝毫不逊色。其系结目标延伸到任何元素与属性,来源除了ADO.NET以外,更包括CLR(Common Language Runtime)对象、XML、WPF元素。此外,系结模型则涵盖一次(One Time)系结、单向(One Way)系结、双向(Two Way)系结等,使程序设计师在画面上,产生多个字段的连动效果。最后是动态系结,表示当事件(event)发生后,才驱动数据系结,并反应到画面上。这 场议程略为可惜之处,在于讲师仅简单地展示,却没有特别实例显现出WPF在数据系结的强大威力。但这只是冰山一角,有心的学员将会在接续的议程中体会 WPF的愿景。     WPF的愿景:电子文件     第二场议程一开始,讲师彭靖灏就以简报带出WPF的愿景:电子文件。讲师提到,微软针对展示层技术所揭橥的愿景,让使用者可以用计算机屏幕浏览各式电子文 件。过去,这方面的应用并不成熟,画面设计在排版或逻辑上都困难,使用者也无法习惯以计算机屏幕观看电子文件。随着展示层技术推陈出新,使用者对出版品与 电子书等要求越来越高,相同的要求也反应在Web Page上。     就实作技术面,WPF分为4点愿景逐步实现,除了第一场次已说明的宣告式程序设计,首先是整合、向量组合式图形作业引擎,目的是善用个人计算机的威力和强 大的3D绘图卡上图形处理效率。其次是WPF提供处理使用者接口、文件及媒体一致的作业方式,让使用操作的经验可整合至开发作业;最后是部署便利,允许管 理人员安全的部署及管理应用程序。     为了让学员更了解WPF的愿景,讲师立即以其未来目的补充愿景的意涵,也就是分辨率无关的图形、双精准度浮点坐标及转换(transformation) 架构、抽离硬件能力等。简单地说,电子文件关键在于浏览时的弹性,不因绘图卡、屏幕分辨率等而影响阅读。     精致的新字型与色彩显示技术     讲师提到电子文件所面对的十大挑战,有些必须仰赖第三方技术与WPF共同解决,但就WPF能力所及的革新,首先是电子内文的阅读舒适性,微软在 ClearType字型上增加Y轴反锯齿功能(YDirection Anti-aliasing),使字型在放大过程中不失真。此外,在色彩显示技术上,除了传统的RGB等3原色外,另新增色彩饱和度。     以操作者角度改善程序接口     讲师在后半场的议程讨论使用者体验此议题,他也很诚实地说到,虽然与主题没有密切相关,还是建议学员参考微软所提出的接口规画模型。WPF除了展示层技术 外,微软在Windows-based与Web-based整合设计的问题上,也从使用者角度重新思考操作接口的规画。Windows-based应用程 序常因为程序设计师的习惯,而采用许多专业术语(例如log),造成使用者无所适从。另一个问题则在于设计师过于遵循Windows设计规范,制式地在工 具列上套用File、Edit、Tools等功能,却忽略使用者最需要的按钮。相关的问题,均反应出传统Windows应用程序由设计师决定操作接口设计 时,缺乏引导使用者操作的问题。相对地,Web-based应用程序常藉由超级链接功能,隐藏了按钮的枯燥与制式化。WPF结合Windows与Web两 种设计后,可以让窗口化设计也具备Web化的指引模式。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档