这是一个非常广泛的问题。我的公司最近撰写了一份白皮书,概述了这两种技术之间的区别,大约有70页。不幸的是,它还没有出版,否则我会给你链接。
编辑:如承诺的那样,这是Codeplex上的白皮书链接:
http://wpfslguidance.codeplex.com/
然而,我会尝试概括一下。
WPF是一个厚重的Windows客户端平台,可以访问完整的.NET框架。Silverlight是一种基于浏览器的技术,可以访问.NET框架的子集(称为CoreCLR)。因此,您将注意到在框架内使用看似每天都在使用的方法和对象时存在差异。例如,在String类上Split()方法在Silverlight中有3个重载版本,但在.NET Framework中有6个。您会经常遇到这样的差异。
在WPF中,所有的可视化元素都派生自Visual基类。在Silverlight中,它们不是;相反,它们派生自Control。然而,这两种技术最终都是从DependencyObject类向上派生的。
目前,WPF提供或可用的用户控件比Silverlight更多;尽管这种差异正在通过Silverlight Toolkit和即将发布的Silverlight 3来缓解。
WPF支持3种类型的路由事件(直接、冒泡和隧道)。Silverlight仅支持直接和冒泡。
有相当多的数据绑定差异,在Silverlight的下一个版本中将有所缓解。目前,Silverlight不支持绑定模式OneWayToSource或Explict UpdateSourceTriggers。此外,如果没有设置默认模式,Silverlight会默认使用单向数据绑定,而WPF使用依赖属性指定的默认模式。
Silveright不支持MultiBinding。
Silverlight支持XmlDataProvider,但不支持ObjectDataProvider。WPF两者都支持。
Silverlight只能进行异步网络调用。而WPF可以访问完整的.NET网络堆栈并进行任何类型的调用。此外,目前,Silverlight支持SOAP,但无法本地处理SOAP故障异常(这可能会在Silverlight 3中发生改变)。
加密方面有很大的差异(Silverlight在命名空间中仅拥有20个类,而WPF则可以访问107个)。基本上,Silverlight只支持4种哈希算法和AES加密协议。
Silverlight尚不支持:Commanding、Validation、Printing、XPS文档、Speech、3D、Freezable对象或与Windows桌面的Interop;而这些在WPF中都是可用的。
Silverlight支持浏览器互操作性,更多的媒体流选项,包括时间线标记和Deep Zoom。WPF尚未支持这些功能。
这绝不是完整的,因为我试图将一个70页的文档缩减成要点。
最后,即使存在所有这些差异,微软也在努力缩小两种技术之间的差距。Silverlight Toolkit和WPF Toolkit都解决了各自技术的一些缺点。Silverlight 3将添加许多目前不可用的功能(例如元素到元素数据绑定)。然而,由于核心库存在差异,始终会存在一些框架差异。
你可以说它与Flex和Adobe Air之间的差异非常相似,但这有点误导。
WPF是指一组技术(通过API公开),.NET Framework 3.0及以上版本的用户可以访问以便在屏幕上绘制。
许多WPF API也适用于Silverlight应用程序。
当然,除了WPF之外,Silverlight还提供了许多其他API,因为SL应用程序需要做的不仅仅是在屏幕上绘制。