详解Silverlight和WPF互相扩展

原创
开发 后端
虽然大部分Windows Presentation Format (WPF)和Microsoft Silverlight应用程序应用场景完全不同,但有时候需要同时使用这两种技术来创建更完美的程序,当然,在这种情况下,要对其进行整合和协调,以实现高效开发和可长期维护性。

51CTO.com独家特稿】1.更适合WPF或Silverlight的场景

WPF被设计为创建Windows桌面应用程序,具有访问富用户界面特征,如动画、3D图形、音频和视频,以及直接访问图 形加速硬件以实现更好的图形性能。由于大部分WPF应用程序是在计算机本地运行,因此不会涉及到象Web应用程序那样 的安全限制,因此,如果对文件系统有访问限制的话,WPF应用程序可以只在用户计算机上存储少量的数据,同样,由于 应用程序不用从远程计算机上下载,这非常适合Microsoft .NET® Framework,可以不用包括创建它时的所有完整特性。

Silverlight 被设计为比WPF更广阔的扩展,因为它支持多平台,截至目前,它不仅支持Windows,还支持Mac,Novel 和Linux(Moonlight – 目前和Silverlight  1.0相当,等价于Silverlight  2.0的版本目前也正在开发中 )。

然而,为了实现这个伟大的目标,Silverlight 必须要能够在各种浏览器及不同操作系统环境下能够运行,这需要在 Silverlight 上增加一些结构性限制,因为在不同系统下对硬件驱动的方式可能不一样,如Windows下的Direct X®和 Windows显示驱动模型,它们在Mac和Linux上就没有。

接下来就是Silverlight 在浏览器中的插件的大小了,微软被要求省略掉.NET Framework中许多特性,否则插件过大 ,其中很多特性又不常用,对用户而言用处不大,这会影响用户的下载积极性,正是由于这个限制,Silverlight 短期 内还做不到WPF那么丰富的功能。

在选择哪种技术更适合项目时,如果考虑图形加速,或那些只有WPF中才有的特性,或者对性能要求很高时,那选择 WPF是最恰当的,相反,如果你对性能要求不是太高,同时又想将应用扩展到Mac和Linux平台时,那只有选择 Silverlight 了。

2.既适合WPF又适合Silverlight的场景

最开始在WPF下开发的Windows客户端应用程序可能会扩展到Mac或Linux平台上运行,例如,当WPF引入时,我创建了 一个XBAP应用程序(XAML浏览器应用程序),它包括了我2006年在塞内加尔旅游时拍摄的照片,不幸的是,由于我们的 朋友没有安装.NET Framework,因此在它的电脑上不能看到这些照片,通过将这个程序转换成Silverlight,我的朋友或 那些不想安装.NET Framework的人都可以轻松看到这些照片了。

在Mike Tucker的博客站点上有一篇很有趣的文章,讲的是最初是由Silverlight 创建应用程序,然后又转换到WPF应 用程序的例子,Tucker在寻找一种方法来调整它的Silverlight 程序性能,但他没有找到这样的工具,于是决定创建一 个等价的WPF程序。

Caliburn是一个应用程序框架,它被设计用来帮助开发人员实现不同的模型,如MVC,MVP,Presentation模型(MVVM ),命令和应用程序控制器就是一个同时使用了Silverlight 和WPF开发的程序示例,与此类似,开发人员也想使用这两 种技术创建自己定制的控制器。

3.WPF和Silverlight 特性对比

由于Silverlight 是WPF的一个大子集,Silverlight 有些特性WPF没有,而且它们共同的技术特性其实现形式也有所 不同,Vertigo Software的Christopher Vigna允许我们使用下面的简图来说明这一点。

 

图- 1 WPF和Silverlight 对比图(2009年二月)

特性集包括依赖属性、风格和可视化树是两者共同的特性,但实现方式却不一样

网络上不缺乏对这两种技术进行对比的博客文章和论坛讨论主题,但由于这两个技术都处于不停的发展阶段,因此, 如果从博客文章去收集整理它们之间的不同之处显得非常不可靠,因为你看到的博客文章可能已经过时了,如果非要说 的话,那MSDN在线帮助文件可能要算最权威的了,但它也有过期的那一天,尽管如此,它在检查WPF和Silverlight 当前 的不同之处时还是非常有用的,它不仅说明了在编程时如何处理它们,还对未来这两者之间可能合并的功能进行了阐述 。

3.1数据绑定

数据绑定可能是WPF给人印象最深刻的特性之一了,Silverlight  2也支持部分数据绑定功能,但有些例外,如 Silverlight  2不支持绑定一个UI元素到另一个UI元素,在WPF中一个经典的例子是Slider绑定到一个TextBox或 TextBlock上;相反,Silverlight 被限制,绑定UI元素只能绑定到标准的.NET对象上,如数值变量(如绑定一个 TextBlock到某个时间点上),Silverlight 也不支持直接绑定到XML上,但在WPF中可以通过XmlDataProvider来实现。
这并不意味着Silverlight 不能将某个UI元素的属性值链接到另一个UI元素的属性值上,只不过不是通过数据绑定 实现的;如果要在Silverlight 中实现这个链接功能,需要开发人员自己编写事件处理程序,但没有使用数据绑定那么 省事,WPF也支持事件处理程序。

为了对Silverlight 数据绑定有一个详细的了解,我建议你阅读Jesse Liberty和Tim Heuer合作写的文章(链接地址 :http://www.devx.com/RIA/link/38130)。

领会WPF和Silverlight 包含相同的类也很重要,这也并不意味着这两个类共享相同的成员,例如,下面的图片说明 了WPF中的绑定类要比等价的Silverlight类具有更多的属性,最能说明这些不同之处的是Silverlight 浏览器插件大小 希望做得非常小,在Silverlight 中缺少某些属性,如ElementName属性,正是如此,也解释了为什么在Silverlight 中 不支持将一个UI元素绑定到另一个UI元素了。

 

图- 2 WPF绑定类属性列表

 

图- 3 Silverlight 绑定类属性列表

3.2触发器

WPF中的触发器已经被证明在启动和停止动画非常有用,不过遗憾的是,在Silverlight 中几乎就没有触发器, Silverlight 只支持事件触发器(EventTrigger)和BeginStoryboard行为,由于WPF和Silverlight 一个共同特性就是 都支持动画,而Silverlight 又缺乏触发器的支持,因此在那些严重依赖动画的应用程序上,这是一个很大的负面影响 ,Silverlight通过使用VisualStateManager减轻了这个影响,微软计划将VisualStateManager移植到WPF,如果真的那 样的话,Silverlight /WPF开发就可以联合起来了,应用程序的联合也就变得更简单了。

3.3控件支持

目前,WPF比Silverlight 包含更多的控件,Silverlight 中最注目的省略是FlowDocument,ToolBar,ListView, Menu,Context Menu和Ribbon控件,在MSDN帮助文件中详细列出了WPF有的控件和Silverlight有的控件,还有两者都有 的控件。

Silverlight 控件开发正在飞速发展,在CodePlex网站上可以看到Silverlight 工具集,这个站点反应了微软关于 Silverlight 控件新的开发策略,现在已经转向开源了,目前至少有一打的控件处于开发阶段,大部分都处于beta阶段 ,很快你就能看到最终发行版了。

3.4 3D图像

3D图像在WPF中虽然还没有得到普遍支持,但在Silverlight 中却完全没有支持。

#p#

4.预先规划你的应用程序

预先规划应用程序的***步是***确定你该做什么,实际上,在你的解决方案中同时需要WPF和Silverlight ,如果 其中一个或有其它解决方案能够满足你的需要,通过只构建一个解决方案而不是两个,这样可以大大节约工作量,而且 在只使用一种技术的前提下,你可以充分使用该技术的特性,在同时使用两种技术的情况下,你需要考虑每个特性的兼 容性。

假设你的确需要这两种技术,接下来你需要找出WPF和Silverlight 之间的结构化差异对项目的影响,如果WPF和 Silverlight 解决方案都还没有完全完成,这样特别有用,通过预先规划可以减少实现两个解决方案的工作量,例如, 假设有个项目的实现方法不止一个,其中一个或更多在其它技术中不可用,也可能其中一个或多个在两种技术中都可用 。一个***的例子就是WPF中的内嵌内容可以使用下列方式实现:

<BUTTON>我的内容

</BUTTON>

但这种实现在Silverlight 中是不能工作的,一个好的解决办法是将内容设置为属性,这样在两种技术中都能工作, 如:

<BUTTON Content="我的内容">

与此类似,WPF和Silverlight 都支持通过关键字引用样式设置应用程序特定元素的样式,但只有WPF可以使用 TargetType应用隐含样式。

接下来最关键的就是决定是启动一个Silverlight 项目还是启动一个WPF项目,我推荐只有极少例外的情况才使用 Silverlight 项目,因为Silverlight 是WPF的一个子集,你在Silverlight 中实现的应用程序特性毫无疑问可以在WPF 中通过相同的方法或类似的方法实现。

5.联合开发指南

改善应用程序两个不同版本之间的长期可维护性的一个绝对有效的方法是在两个项目之间共享文件,可以在一个项目 中常见文件,然后在另一个项目中创建到该文件的链接即可,而不是直接拷贝一份。

 

图- 4 添加一个文件链接而不复制该文件

在两个不同的项目之间共享文件不是没有问题,前面已经说过,在Silverlight 中能够运行的代码在WPF中不一定能 够运行,在某些情况下,可以使用条件编译来解决这个问题。

#if 

SILVERLIGHT
             //Silverlight compatible code goes here
#else
             //WPF compatible code goes here
#endif

虽然条件编译只适合后台代码而不适合XAML,但幸运的是XAML在这两种技术之间几乎没有不相容的地方。

2009年2月,微软的模式和实践组发布了Prism v2,它是一个WPF和Silverlight 混合应用指南,Prism v2由可重用代 码库,引用(示例)实现和文档组成,包括许多快速入门和动手实验,这些项目的共同目的是帮助开发人员使用WPF或 Silverlight ,或者两者一起来创建模块化应用程序,这里的模块化应用程序指的是由大量分离的,松散耦合的,独立 的片段组成的程序,这些片段之间是可以相互交互的,这里的前提是这些模块是可以独立开发,测试和部署的,而且这 些模块在之后是可以独立修改和扩展的。

Prism的初始版本仅仅将目标瞄向WPF,版本2倾向于同时用于WPF和Silverlight ,Prism V2允许在WPF和Silverlight 之间***化代码共享,而且,引用实现和相关的文档倾向于提供明确的指南,示例代码则集中于WPF/Silverlight 应用 程序联合开发。

6.开发转换指南

现实中你可能要面对一个已经开发完成或接近尾声的项目,你的任务是选择一种技术来实现,这个时候你必须做出决 定,是在现有的解决方案上进行拷贝还是创建一个崭新的方案,然后再从现有的项目中复制粘贴代码,创建一个全新的 解决方案有一个好处就是可应用的模板会使用正确的项目设置创建,而修改现有的解决方案可能需要手工修改它们。如 果这是一个一次性转换,那么从创建一个全新的解决方案开始是个不错的办法,如果不是,那你***先强迫自己了解它 们的差异。

7.小结

任何人都希望实现在WPF和Silverlight 之间的无痛快速转换,但事实上可能会让人失望,联合开发需要预先做好规 划,如果你按照正确的策略和步骤,其实还是相当可行的。

我建议的清单包括以下步骤:

(1) 是联合开发还是进行转换,究竟是选择WPF还是Silverlight,都要仔细评审。

(2) 评审WPF和Silverlight 之间的不同之处,MSDN帮助文件已经详细列出了它们之间的差异。

(3) 在评审结果基础之上,决定是WPF还是Silverlight 更适合你的项目。

(4) 对于一个新开发的项目,决定是先创建WPF项目还是先创建Silverlight 项目(一般情况向应该先创建 Silverlight 项目)。

(5) 然后确定在这两个项目之间有多少文件可以共享。

(6) 仔细考虑这两个项目之间是否允许有分歧,以便确定是否可以***化使用每种技术的特性。

(7) 对于将一个现有项目要转换成另一种技术实现,首先要决定是创建一个全新的项目,然后从现有项目中 复制粘贴代码,还是就在现有项目基础之上进行转换。

【编辑推荐】

  1. 使用LINQ和ADO.NET创建 Silverlight程序
  2. 微软MVP评Silverlight的功能特 性和价值
  3. 走向银光 —— 一步 一步学Silverlight2

责任编辑:彭凡 来源: 51CTO.com
相关推荐

2009-08-31 16:49:23

WPF线程模型

2009-11-17 10:47:14

Silverlight

2009-12-31 16:56:40

Silverlight

2009-12-28 11:41:04

WPF 3.5特点

2009-12-28 10:47:58

WPF绘图

2009-12-31 10:07:08

Silverlight

2009-12-23 17:42:37

WPF Control

2009-02-02 10:53:34

SilverlightSilverlightRIA

2009-07-27 09:46:28

Silverlight

2009-12-31 17:31:23

Silverlight

2009-09-27 10:03:53

Silverlight

2009-12-30 14:36:29

Silverlight

2009-12-29 18:29:09

Silverlight

2010-01-04 18:33:39

Silverlight

2009-12-29 17:25:36

Silverlight

2009-02-20 08:54:20

DownloaderSilverlight对象

2009-08-12 10:47:38

Silverlight

2009-12-28 16:54:30

WPF注释

2010-01-04 10:41:14

Silverlight

2010-01-04 13:09:51

Silverlight
点赞
收藏

51CTO技术栈公众号