首页 > 代码库 > Prism 4 文档 ---第10章 Silverlight和WPF之间共享代码
Prism 4 文档 ---第10章 Silverlight和WPF之间共享代码
超出范围
多目标场景
- 你可以为用户提供一个在办公室的具有全功能的以及在旅行时可缩减功能的基于浏览器版本的的应用程序。
- 你可以为内部用户提供一个桌面班的应用程序并为外部人员或参与者一个浏览器应用程序。
多目标的思考
- Silverlight提供的独立存储在本地客户端计算机上存储空间有限。
- 你可能会在你的多目标的解决方案中的代码中失简洁性和易读性。因为一些WPF的功能在Silverlight中并没有实现。你将需要解决这些问题,并且这将会导致你的代码不再优雅或者易读。
- 默认情况下,Silverlight应用程序在一个安全的沙箱中运行,所以有几件事情,你不能在沙箱环境外进行的。这些应用具有受限访问本地计算机和被限制,以帮助防止恶意行为。这些限制防止对设备的访问,并与其他正在运行的程序进行交互。
注意:如果你需要访问这些项目的其中一些,你可以创建一个具有提升信任权限的浏览器以外的Silverlight应用程序。更多信息,请看MSDN上的"Trusted Applications"
- Silverlight只支持异步通信,所以你不能在多目标应用程序中使用同步通信。
多目标元素
- 展现模式。模式例如MVVM,MVP和MVC,如果在平台之间逻辑大部分相同时都可以使用这些模式。
- 服务。帮助展现的服务可以经常用于多目标。
- 单元测试。许多单元测试在工具中可以是多目标的,例如Silverlight 单元测试,框架可以使用例如MSTest的相同的属性结构。
- 简单的视图。如果XAML被用于支持Silverlight和WPF。如果一个视图仅由基本控件和简单的数据绑定组成,它有可能也可以在WPF和Silverlight之间共享。
- Complex Views(XAML)
- Controls
- Styling
- Animation
- Expression Blend behaviors 和triggers
一个多目标的解决方案:多链接的项目
核心应用程序
创建多目标应用程序
- 设计和编码方针。这一节描述了在Silverlight和WPF之间共享代码的考虑内容。
- 程序的指导方针。这一节描述了Silverlight和WPF之间共享代码的实现方式。
- 团队建设指导方针。这一节描述了当构建多目标程序是特定的软件团结构建的问题。
- Silverlight和WPF之间的对比。这一节描述了Silverlight和WPF之间的区别。
设计和编码方针
- 使用表现分离模式来最大化共享代码的数量。
- 当可能时,编辑可以在两个平台下编译的代码。如果不行,按以下操作:
- 使用#if标签如果你有简单或者单行构造方法。
- 在类的大部分相似但是一些方法具有特定平台的实现时使用部分类
- 只有当你需要在一个平台调用外部方法但是在另一个平台不需要调用外部方法时使用部分方法
- 使用单一职责构建指定平台的类
- 为Silverlight和WPF创建各自的解决方案文件夹
- 在重构代码时间长Silverlight和WPF的引用。
使用表现分离最大化共享代码数量
编写在两个平台中编译的代码
ItemsControl someItemsControl = new ItemsControl();someItemsControl.Items.Add(new TextBox());bool hasDependencyObjects = someItemsControl.Items.Any(item => item is DependencyObject); |
ItemsControl someItemsControl = new ItemsControl();someItemsControl.Items.Add(new TextBox());bool hasDependencyObjects = false;foreach (var item in someItemsControl.Items){ if (item is DependencyObject) { hasDependencyObjects = true; break; }} |
如果你有简单或者单行构造 使用#if 声明
#if SILVERLIGHT System.Windows.Application.Current.RootVisual = shell;#else Application.Current.MainWindow = shell; shell.Show();#endif |
- 代码缺少易读性和易维护性。如果代码中散列这#if声明,它会变得很难阅读和维护。
- 调试变得困难。如果在构造方法中有一个编译错误。当你尝试打开文件时,Visual Studio 选择了包含物理文件的解决方案而不是包含错误的解决方案,这意味这你必须手动的关闭这个文件然后打开正确的解决方案或者在没有只能提示的情况下编辑代码。
在类的大部分相似但是一些方法具有特定平台的实现时使用部分类
- 尽量将特定平台的方法保持为私有的。在这种方式中,单元测试将不需要为特定的平台而包含特定的逻辑。
- 确保类有单独的,清晰的职责,任何为特定平台编写的部分类应该指改变详细的实现内容。
namespace RealEstateListingViewer.Services{ public partial class RealEstateService: IRealEstateService { public RealEstate GetRealEstate () { ... return property; } } |
namespace RealEstateListingViewer.Services{ public partial class RealEstateService { /// <summary> /// Return the images. In Silverlight, you want to download the image /// from a web server. /// You can either store the images on the server or build an /// HTTP handler to retrieve the images. /// </summary> private static BitmapImage GetImage() { Uri imageUri; Uri source = App.Current.Host.Source; if (source.ToString().StartsWith("file://", StringComparison.OrdinalIgnoreCase)) { imageUri = new Uri("../Images/House.jpg", UriKind.Relative); } else { source = new Uri(string.Format(CultureInfo.InvariantCulture, "{0}://{1}:{2}/", source.Scheme, source.Host, source.Port)); imageUri = new Uri(source, "Images/house.jpg"); } return new BitmapImage(imageUri); } }} |
namespace RealEstateListingViewer.Services{ public partial class RealEstateService { /// <summary> /// Return the images. In a windows application, normally you /// retrieve the image from a database. /// But for simplicity, it is just being retrieved from the file system. /// </summary> private static BitmapImage GetImage() { return new BitmapImage(new Uri("../Images/house.jpg", UriKind.Relative)); } }} |
- 部分方法的声明必须以partial关键字开始并且返回类型必须为void。
- 部分方法可以拥有ref参数但是不能有out参数
- 部分方法是隐性的private的,因此,不能为virtual。
- 部分方法不能是extern的,引入呈现的主题决定了它们是否被定义或者被实现。
- 部分方法可以拥有static和unsafe修饰符
- 分部方法可以传统的。在部分方法的声明中定义了约束,并可以选择性地在实现中重复定义这些规则。参数和类型参数名称在实现中不必与定义的名称一模一样。
- 你不可以将一个delegate赋值给一个部分方法。
使用单一职责构建指定平台的类
- 在不同的平台中使用通用的接口来共享代码。例如,在Prism类库中,有几个用于加载模块类型的特定平台的类,比如用于Silverlight的XapModuleTypeLoader和用于桌面程序的FileModuleTypeLoader。它们头实现了IModuleTypeLoader接口。
- 当在不同的平台中共享一些功能时,有利于组成整体继承(例如,使用策略模式)。换句话讲,确定在一个共享类中分解出具有特定功能共享的代码是否有益于。在某些情况下,使用继承是有意义的。
为Silverlight和WPF创建各自的解决方案文件夹
重构代码时检查Silverlight和WPF的引用
过程指导
- 在Silverlight中开发内核。
- 在源项目与目标项目之间连接共享代码。
- 为Silverlight和WPF项目使用相同的命名空间。
在Silverlight中开发应用程序内核
在源项目与目标项目之间连接共享代码
在Silverlight和WPF项目中使用相同的命名空间
团队构建指导
在构建地配置团队构建
<PropertyGroup><!--Build in place--> <CustomizableOutDir>true</CustomizableOutDir></PropertyGroup> <!—Override the BeforeTestConfiguration target to specify where the testcontainers live. --> <Target Name="BeforeTestConfiguration"> <!-- Change the outdir, because the testtoolstask needs this to execute all the tests --> <PropertyGroup> <OutDir>$(SolutionRoot)\Source\</OutDir> </PropertyGroup> <!--Create a list of all tests dll‘s to run (test only the desktop versions) --> <CreateItem Include="$(SolutionRoot)\**\Desktop\**\Bin\Debug\%2a.Tests.dll"> <Output ItemName="TestContainer" TaskParameter="Include" /> </CreateItem> </Target> |
Silverlight和WPF 对比
Silverlight和WPF 架构概述
Silverlight与WPF之间的区别
触发器
- 在Silverlight中,灭有OneWayToSource数据流模式
- 在Silverlight中,你不能直接绑定到XML数据。一个可能的解决方法是将XML转换为CLR对象,然后绑定到CLR对象。
- 在Silverlight中,没有XMLDatProvider类。
- 在Silverlight中,没有DataTemplateSelector类。在WPF中,这个类提供了基于数据对象和数据绑定元素的选择DataTemplate的方式。然而,为了支持特定的MVVM场景,Prism在它的DataTemplateSelector类中为Silverlight提供了类似的功能。
命令
- 在Silverlight中路由命令不可用。然而,在Silverlight中ICommand接口可以用,允许开发人员创建它们自定义的命令。Prism类库提供了DelegateCommand 和CompositeCommand 类为简单的命令的实现。
- 在WPF中,控件可以通过它们的Command属性连接到命令。通过做这些,开发人员可以声明关联的控件和命令。这也意味者一个控件可以通过命令交互以使得它可以滑行命令并且使得它的状态自动更新。在Silverlight中国,一些控件支持Command命令,但是不想WPF那样多。对于那些没有提供了Command属性的Silverlight控件,考虑使用Blend 行为基于触发器来唤醒命令。
- 在Silverlight中没有输手势和输入绑定。
杂项
- 在Silverlight中,UIElement类有一个内部构造方法;因此,你不能创建一个控件继承它。
- 在Silverlight中,没有对X:Type扩展标记的支持或者自定义扩展标记的支持。
- 在Silverlight中,没有对X:Static扩展标记的支持或者自定义扩展标记的支持。在Silverlight中,添加到TabControl控件的子项不会像WPF中那样自动的被封装懂啊一个TabItem中。
- 所哟Silverlight网络调用都必须是异步的。
- Silverlight的网络,除了信任外的浏览器应用程序,对于服务器客户端访问策略原产地以外的网站服务器。
更多信息
http://blogs.msdn.com/b/clrteam/archive/2009/12/01/sharing-silverlight-assemblies-with-net-apps.aspx
http://msdn.microsoft.com/en-us/library/ms750441.aspx
http://msdn.microsoft.com/en-us/library/bb404713(VS.95).aspx
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
Prism 4 文档 ---第10章 Silverlight和WPF之间共享代码