Prism 4 文档 ---第10章 Silverlight和WPF之间共享代码


    本主题帮助你理解来自Prism的多目标和它的优缺点。多目标的代码针对两个不同的平台有大致相同的代码库。这允许同时保持代码尽可能多一样能够产生针对两种不同技术的二进制文件。在这种情况下,本节介绍的技术是WPF和Silverlight。本主题包含了一些你在使用这些技术开发多目标应用程序的时候的注意事项。 目标和有点     当在编写具有相似功能和能力的WPF和Silverlight应用程序的时候,努力使用一个代码库很有意义。尽管WPF和Silverlight平台非常相似,但他们只有有限的二进制兼容性。仅Silverlight4中引用的一组特定的内核,可移植的框架程序集可以被加载到.NET Framework4.0的运行时中。     因为Prism为WPF和Silverlight提供了大量的相似的功能。许多的代码可以针对这两种技术进行生成。支持多目标应用主要是有关实现在两个环境之间共享代码和组件的最大化的可能性的模式和结构,以及用于允许一个应用程序集成环境特定的功能,使之能够充分利用台式机或浏览器的的特定的功能。通过创建使用Prism的多目标组合应用程序,您可以重用跨越WPF和Silverlight应用程序的源代码。

超出范围

    如果你可以组织你的组件,以充分利用Silverlight和WPF之间的二进制兼容性的支持,你应该这样做。关于这一点的更多信息,情况CLR团队发布的博客"Sharing Silverlight Assemblies with .NET Apps."     本章不打算来形容这种情况下,相反,它描述了通过共享源代码构建多目标应用所面临的挑战和解决方案。

多目标场景

    主要情况是对于同时提供了功能丰富的桌面体验和宽范围的互联网应用体验的应用程序。在这种情况下,您可能希望开发对WPF和Silverlight或一个提供不同的功能和工作流程相同的功能和工作流程的应用程序。以下一些多目标的应用程序:
  • 你可以为用户提供一个在办公室的具有全功能的以及在旅行时可缩减功能的基于浏览器版本的的应用程序。
  • 你可以为内部用户提供一个桌面班的应用程序并为外部人员或参与者一个浏览器应用程序。
    例如,一个企业可能想同时拥有一个那些用户想要通过电话来下订单电话呼叫中心的应用程序和一个那些想要在网上下订单的客户能够在网上下订单的应用程序。然而,形式是完全不一样的。电话呼叫中心桌面订单的形式相比在网上下订单的形式提供了更多信息和扩展功能。然而,因为他们完成类似的东西将有订单和业务逻辑可以跨两个场景中重复使用的某些部分。     面向服务的应用程序更容易实现多目标,因为Silverlight先天就是面向服务的。Silverlight由于它的目标功能设置和安全机制使得它不支持本地存储或者访问数据库。另外,连接的应用程序也更容易多目标,因为Silverlight的关联性质。

多目标的思考

    通过解决方案的多目标性,你也应该考虑以下几点:
  • Silverlight提供的独立存储在本地客户端计算机上存储空间有限。
  • 你可能会在你的多目标的解决方案中的代码中失简洁性和易读性。因为一些WPF的功能在Silverlight中并没有实现。你将需要解决这些问题,并且这将会导致你的代码不再优雅或者易读。
  • 默认情况下,Silverlight应用程序在一个安全的沙箱中运行,所以有几件事情,你不能在沙箱环境外进行的。这些应用具有受限访问本地计算机和被限制,以帮助防止恶意行为。这些限制防止对设备的访问,并与其他正在运行的程序进行交互。
注意: 如果你需要访问这些项目的其中一些,你可以创建一个具有提升信任权限的浏览器以外的Silverlight应用程序。更多信息,请看MSDN上的"Trusted Applications"
  • Silverlight只支持异步通信,所以你不能在多目标应用程序中使用同步通信。

多目标元素

    通常情况下有许多的代码与实际展示结束是毫无关系的。由于Silverlight和.NET Framework运行时本质上非常相近。大部分的代码可以两种技术之间共享。这也鼓励大量使用展示隔离的模式,以从实际可视化展示和展现逻辑之间分开。为了最大化的分离UI和非UI代码。你可以使得以下多目标源代码元素:
  • 展现模式。模式例如MVVM,MVP和MVC,如果在平台之间逻辑大部分相同时都可以使用这些模式。
  • 服务。帮助展现的服务可以经常用于多目标。
  • 单元测试。许多单元测试在工具中可以是多目标的,例如Silverlight 单元测试,框架可以使用例如MSTest的相同的属性结构。
  • 简单的视图。如果XAML被用于支持Silverlight和WPF。如果一个视图仅由基本控件和简单的数据绑定组成,它有可能也可以在WPF和Silverlight之间共享。
    Silverlight 的API大部分是.NET Framework的API的子集,所以它使用这种更小的API来开发应用程序来减少使用在多个平台之间不能同时使用的功能的机会经常很有意义。由于Siliverlight和WPF的XAML之间的不同,以下元素比较难以复用:
  • Complex Views(XAML)
  • Controls
  • Styling
  • Animation
  • Expression Blend behaviors 和triggers

一个多目标的解决方案:多链接的项目

    Silverlight和WPF只有有限的二进制兼容,所以一些代码还组合必须在每个目标环境中被重新编译。Prism采用的机制用于在应用程序的结构和将模块代码引用到多个项目的提供指导。每个工程都管理者所有的引用,资源,和WPF和Silverlight目标环境指定的代码。在两个项目之间连接的代码的共享使得它们自动的编译到各自的目标中,单元测试可以类似的被两个环境间共享,以使得它们可以被一次编写在任何一个目标环境中运行目标代码。Prism 团队创建了一个名为项目连接器的工具来帮助创建和维护这些连接。项目连接器工具用于在Prism类库,快速启动,和实现引用中连接项目。     注意:         你可以从Visual Studio Gallery 中下载项目连接器或者打开Visual Studio,在工具菜单中点击扩展管理,在扩展工具管理窗口的联机库中查找项目连接器。     非UI代码和组件可能更容易被共享,所以坚持分离UI模式是确保UI和非UI部分的应用程序或模块被清晰地划分开至关重要的。    

核心应用程序

    这个模式的整体是基于应用程序内核代码共享的并且然后使用实现了WPF和Silverlight特定功能的扩展项来扩充的。应用程序的内核定义了应用程序的整体结构并且包含了在两个环境中通用的代码和组件。Silverlight是WPF的主要的一个子集,所以在Silverlight中开发应用程序内核减少了依赖一个在WPF 中支持但在Silverlihgt中不支持的API的风险。     注意:     在Prism源码树中许多的项目实际上在WPF项目中拥有内核源文件,将Silverlight项目连接到WPF项目的文件。这主要是由于Prism的第一个版本实在Silverlight发布之前构建的历史原因造成的。     下面的插图展示了Multi-Targeted QuickStart的资源管理器。QuickStart的大多数的WPF版本是连接的文件因为应用程序的内核实在Silverlight中开发的。在QuickStart中找到的共享的文件包括图片,模块,服务,接口和资源。共享(连接)的文件被突出显示。

Silverlight与WPF之间的区别

    为了保持Silverlight的小而轻,一些WPF和.NET Framework功能在Silverlight中是不可用的。正因为如此,有可能是微妙和不那么微妙的差别是要构建一个针对WPF和Silverlight的应用程序时,或者Silverlight和WPF之间过度应用程序时要慎重考虑。本节将描述在Prism团队开发Prism是遇到的一些主要的不同。这些区别针对Silverlight4和WPF 4.0,当前编写时的版本。 资源     资源是一些可以存储几乎任何元素(字符串,画刷,样式,数据源,以及许多其他的)的键-值的简单的集合。资源可以关联到几乎任何暴露了ResourceDictionary类型的Resoures属性的元素类。以下是Silverlight和WPF关于资源的一些不同:     资源可以包含静态或者动态内容。动态内容可以在运行时背改变并且资源的消费者将会自动的被更新。Silverlight中不支持动态资源引用;因此,只有静态资源引用可用。

触发器

    触发器允许设计者定义控件的可视化行为,通过声明式指定它的属性在对于事件或者属性改变时做出反映时如何改变,例如在点击一个按钮时突出显示按钮。通常,触发器在当一个控件的属性发生变化时被触发并且导致控件的一个或者多个属性发生变化。触发器被定义在样式内部并且可以被应用与指定目标类型的任何对象。     Silverlight并不支持Styles,ControlTemplates,或者DataTemplates(Triggers集合并不存在与这些元素中)的触发器。然而,通过使用Silverlight的可视化状态管理器(VSM)来定义控件模板交互也可以达到类似的行为。使用VSM,控件的可视化行为,包含任何动画和转换,被定义在空间的模板中。这些可以在Blend4中很容易的做到。然而,要知道XAML文件将会变得更复杂并且内置在Silverlight中的模板并没有与WPF兼容。     Blend SDK 提供了用于动画的Blend 行为并且可视化状态管理器可以用于WPF和Silverlight应用一致的外观及感觉。 数据绑定     WPF和SIlverlight都提供了对数据绑定的支持。以下是Silverlight和WPF之间数据绑定的主要不同:
  • 在Silverlight中,灭有OneWayToSource数据流模式
  • 在Silverlight中,你不能直接绑定到XML数据。一个可能的解决方法是将XML转换为CLR对象,然后绑定到CLR对象。
  • 在Silverlight中,没有XMLDatProvider类。
  • 在Silverlight中,没有DataTemplateSelector类。在WPF中,这个类提供了基于数据对象和数据绑定元素的选择DataTemplate的方式。然而,为了支持特定的MVVM场景,Prism在它的DataTemplateSelector类中为Silverlight提供了类似的功能。

命令

    以下是WPF和Silverlight中关于命令的一些不同:
  • 在Silverlight中路由命令不可用。然而,在Silverlight中ICommand接口可以用,允许开发人员创建它们自定义的命令。Prism类库提供了DelegateCommand 和CompositeCommand 类为简单的命令的实现。
  • 在WPF中,控件可以通过它们的Command属性连接到命令。通过做这些,开发人员可以声明关联的控件和命令。这也意味者一个控件可以通过命令交互以使得它可以滑行命令并且使得它的状态自动更新。在Silverlight中国,一些控件支持Command命令,但是不想WPF那样多。对于那些没有提供了Command属性的Silverlight控件,考虑使用Blend 行为基于触发器来唤醒命令。
  • 在Silverlight中没有输手势和输入绑定。

杂项

    以下是Silverlight和WPF之间的一些杂项的差异:
  • 在Silverlight中,UIElement类有一个内部构造方法;因此,你不能创建一个控件继承它。
  • 在Silverlight中,没有对X:Type扩展标记的支持或者自定义扩展标记的支持。
  • 在Silverlight中,没有对X:Static扩展标记的支持或者自定义扩展标记的支持。在Silverlight中,添加到TabControl控件的子项不会像WPF中那样自动的被封装懂啊一个TabItem中。
  • 所哟Silverlight网络调用都必须是异步的。
  • Silverlight的网络,除了信任外的浏览器应用程序,对于服务器客户端访问策略原产地以外的网站服务器。

更多信息

     你可以从Visual Studio Gallery 中下载项目连接器或者打开Visual Studio,在工具菜单中点击扩展管理,在扩展工具管理窗口的联机库中查找项目连接器。     关于组织程序集结构来获得在Silverlight和WPF之间二进制兼容性的优势的更多知识,请看CLR 团队发布的博客"Sharing Silverlight Assemblies with .NET Apps":

    http://blogs.msdn.com/b/clrteam/archive/2009/12/01/sharing-silverlight-assemblies-with-net-apps.aspx

    关于WPF 架构的更多内容,请看MSDN上的"WPF Architecture"

    http://msdn.microsoft.com/en-us/library/ms750441.aspx

    关于Silverlight 架构的更多内容,请看MSDN上的"Silverlight Architecture" 

    http://msdn.microsoft.com/en-us/library/bb404713(VS.95).aspx

    关于WPF和Silverlight之间的不同的总结更多内容,请看MSDN上的 "WPF Compatibility" on MSDN:

    http://msdn.microsoft.com/en-us/library/cc903925(VS.95).aspx

    关于可视化状态管理器和它如何在创建控件中工作的更多内容,请看MSDN上的以下关于创建自定义控件的文章:

  • http://msdn.microsoft.com/en-us/library/cc278064(vs.95).aspx (针对Silverlight)
  • http://msdn.microsoft.com/en-us/library/ee330302.aspx (针对 WPF in .NET Framework 4)

    关于创建一个提升信任的应用程序的更多内容,请看MSDN上的, see "Trusted Applications" on MSDN: 

    http://msdn.microsoft.com/en-us/library/ee721083(VS.95).aspx