【51CTO译文】相对而言,使用 C++、C# 或 Visual Basic将 Microsoft Silverlight 应用从 Windows Phone 移植至 Metro风格应用是非常容易的。大部分的工作内容,所需的知识以及体验,将转向使用 XAML 的 Metro风格应用的模型,许多 XAML 界面设计与布局也是如此。
应用移植工作主要包含两部分:
◆修改 UI,利用Windows Metro 风格 UI 的功能与设计指南;
◆从代码隐藏文件中调用的Silverlight API 转向相应的 Windows Runtime API。
很多情况下,代码保持不变,或几乎不变。虽然存在一些差别,但 Windows Runtime 中基于 XAML 的 UP API 是在 Windows Phone 版本的 Silverlight 上进行建模。另外,可使用 Metro 风格的 .NET API,这是完整的 .NET Framework 的子集,与.NET Framework for Silverlight 类似。在某些情况下,类似的.NET API已转移到Windows Runtime,只是设计有稍许不同。
成功移植应用所需的工作量主要取决于:应用是否使用了大量 API,而这些 API 并未包含在 Metro 风格应用的 Windows Runtime 和 .NET API。本文提供了一些常规的移植指南与资源,用于定位 API 并确定多少代码必须进行替换。
本文主要关注的是 Windows Phone 应用的移植,不过,对于任何 .NET 和基于XAML 的项目,可在以下主题中找到有用的相关信息:
将Silverlight 或 WPF XAML/代码移植到Metro风格应用
Windows Phone 7应用移植准备工作
在进行 Windows Phone 7 应用移植之前,请考虑以下相关事项:
◆是否需要对应用进行快速移植或获得更佳的可维护性?“提高可维护性”部分提供了一些技巧,可用于对项目进行单源处理,并且有助于针对不同平台的项目间代码再利用。
◆Windows Phone 7 设备分辨率在水平模式在为水平模式下为800x480 (WVGA),垂直模式下为480x800。Windows 8 Release Preview 设备可具有多种长宽比,多种可能的水平与垂直分辨率。界面与资产如何进行扩展?相关信息。
◆Windows Phone 7 界面为触摸式的。Windows 8 界面也应支持触摸,同时还需支持其他输入方式,如鼠标和键盘。对于某些未使用触摸的用户,你的界面是否感觉很笨拙?无论何种输入方式,如何保持应用的可用性?相关信息,请参阅“可访问性计划”。
◆Windows Phone 7 应用中是否具有手机专业的功能?想法了解Windows Runtime 中相对应的网络技术?如果对手机或提供商提供更多功能支持,那么可能需对其进行重新开发,提供更多的网络或提供商独立性。
◆游戏应用是否依赖用于图形渲染的 Microsoft XNA 组件?如果是,对于 Windows 8 应用无法使用 XNA。另外,对于托管代码,无法有效地使用 DirectX;如果未使用第三发托管 API,那么必须使用 C++ 进行 DirectX 游戏开发。有关更多信息,请参阅“创建DirectX游戏”。
常规移植过程
如果为了优化上市时间,需快速移植应用,请遵循以下步骤:
1.打开 Microsoft Visual Studio Express 2012 RC for Windows 8,使用C++、C# 或 Visual Basic 新建 Metro 风格应用。选择应用布局与功能最为匹配的项目模板。有关更多信息,请参阅“使用模板(C++、C#、Visual Basic)快速创建 Metro 风格应用”。
2.复制想要在新项目中再利用的文件夹、代码与资产文件。
3.在 Visual Studio 的“解决方案浏览器”(Solution Explorer),单击“显示所有文件”(Show All Files)。
4.选择已复制的文件与文件夹,然后右键单击并选择“包含在项目中”(Include In Project)。
5.执行全局搜索与替换,将“System.Windows”替换为“Windows.UI.Xaml”。
6.将原始 XAML 代码中可重用部分复制到新项目的 XAML 文件,或新建的 XAML 文件(如需要)。通常,页面布局根(典型的示例:Grid 元素)可进行复制并重用,而最外层元素(如 PhoneApplicationPage 元素)并非如此。
7.构建项目,生成错误,然后这些错误找到需进行更新或替换的代码。有时,所需的这种更新非常少,只是对参数类型进行更改。但有些更新需要使用 Metro style 所用的 Windows Runtime API 替代 .NET API。为了确认支持哪些 API,可使用本文与“Metro 风格应用 .NET 概述”以及“将 Silverlight 或 WPF XAML/代码移植到 Metro 风格应用”,获取相关指南。
8.对于任何无法轻易进行更新的代码,请进行评注或清除,直到项目构建。
9.一次对评注代码的一个问题进行更新或替换,直到移植完成。
#p#
提高可维护性
为了多个平台上的应用维护变得更加容易,请考虑使用以下技巧:
◆在移植之前,请对代码进行重构,使其尽可能可重用。尤其,通过应用设计模式,如将业务逻辑与 UI 逻辑分开的Model-View-ViewModel (MVVM),可避免 UI API 差异方面的问题。使用 MVVM,模型与视图模型代码在不同平台上可保持大部分不变,同时视图代码(XAML)可根据平台定制。
◆在项目之间共享可重用代码文件,而不是维护针对不同平台的多个副本。如需在 Visual Studio 中进行此类操作,请“解决方案浏览器”(Solution Explorer)中右键单击该项目,选择“添加已有项”(Add Existing Item),选择共享文件,然后单击“添加为链接”(Add As Link)。
◆如需在共享文件中包含某些平台专用代码,请使用条件编译。这种方式仅适用于 C#、C++ 和 Visual Basic 代码。对于 XAML,必须对分开的代码文件进行分别维护。
◆使用 Portable Class Library 创建跨平台的库程序集。该可移植类库包含 .NET Framework for Silverlight、Metro 风格应用 .NET API 和完整的 .NET Framework 中可用 .NET API 的子集。可移植类库是与全部三个平台兼容的二进制文件,因此对于代码重用是最为简单的方式。不过,为了创建针对可移植类库的项目,必须使用 Microsoft Visual Studio Professional 2012 RC 或更高版本。
#p#
移植用户界面
Silverlight 的大多数布局类型,如Canvas、Grid和StackPanel,在 Windows Runtime XAML 命名空间里也会出现。虽然为了适应多种高于 800x480 的分辨率,Grid 和布局设置需要进行调整,但基本用户界面结构的移植应是直接式的。
当然,手机 UI 可能专门为小屏幕手机而设计。简单地对其继续扩展并非最佳设计,应根据 Metro 风格应用的功能以及 Windows 8 设备的多种形状因素对 UI 进行重构。这种功能之一为分屏视图(snapped view),对此手机 UI 设计可能是有用的。
更多信息与设计指南,请参阅以下主题:
对定义应用布局的 XAML 文件进行调整之后,需要更新隐藏代码,以使用 Windows Runtime API 替代 Silverlight API。对于用户界面元素,在两个 API 库之间存在相当一致的映射。
以下为 Windows Runtime XAML 命名空间,大体上与对应的 Silverlight 用户界面命名空间等同。
Silverlight XAML 命名空间 | Windows Runtime XAML 命名空间 |
System.Windows | Windows.UI.Xaml |
System.Windows.Automation | Windows.UI.Xaml.Automation |
System.Windows.Automation.Peers | Windows.UI.Xaml.Automation.Peers |
System.Windows.Automation.Provider | Windows.UI.Xaml.Automation.Provider |
System.Windows.Automation.Text | Windows.UI.Xaml.Automation.Text |
System.Windows.Controls | Windows.UI.Xaml.Controls |
System.Windows.Controls.Primitives | Windows.UI.Xaml.Controls.Primitives |
System.Windows.Data | Windows.UI.Xaml.Data |
System.Windows.Documents | Windows.UI.Xaml.Documents |
System.Windows.Input | Windows.UI.Xaml.Input |
System.Windows.Interop | Windows.UI.Xaml.Interop |
System.Windows.Markup | Windows.UI.Xaml.Markup |
System.Windows.Media | Windows.UI.Xaml.Media |
System.Windows.Media.Animation | Windows.UI.Xaml.Media.Animation |
System.Windows.Media.Imaging | Windows.UI.Xaml.Media.Imaging |
System.Windows.Media.Media3D | Windows.UI.Xaml.Media.Media3D |
System.Windows.Navigation | Windows.UI.Xaml.Navigation |
System.Windows.Printing | Windows.UI.Xaml.Printing |
System.Windows.Resources | Windows.UI.Xaml.Resources |
System.Windows.Shapes | Windows.UI.Xaml.Shapes |
请注意,以下 Silverlight XAML 命名空间在 Windows Runtime 中不具有直接的对等项:
◆System.Windows.Ink
◆System.Windows.Media.Effects
◆System.Windows.Messaging
#p#
使用 XAML 的Silverlight 与 Metro 应用之间的不同
虽然对于 Windows Phone 7 和 Windows 8,Metro 风格 UI 是相同的,但在两个平台的 UI 的功能之间还存在一些差异。以下部分对其中一些关键的不同进行了描述。不过,为了确定具体支持哪些功能,应查询 API 引用。更多关于使用 XAML 的 Metro 风格应用信息,请参阅“采用 C# 或 Visual Basic 的 Metro 风格应用的路线图”。
控件与布局
Windows Runtime 中的 XAML 控件是基于 Silverlight 控件的,但可能存在一些差异或缺少某些功能。例如:
Windows Runtime 未包含 Silverlight for Windows Phone 中提供的 Pivot 和 Panorama 控件。这些控件专门为手机形状因素而设计,有助于提升比手机屏更大屏幕上的用户体验。Metro 风格应用通常具有更大的屏幕空间,并且应利用具有更大灵活性的 Grid 控件的优势。另外,还可以使用 FlipView 控件来提供简洁的翻页体验。
Windows Runtime 中的 AppBar 控件提供的体验与手机 ApplicationBar 类似,不过具有更多的灵活性,支持定制布局与数据绑定。
Windows Phone 可声明支持何种设备旋转方式,因此能够对必需的布局灵活性进行限制。对于 Metro 风格应用,UI 设计应不受设备选择方式与屏幕尺寸的限制。
更多关于控件的信息,请参阅“功能控件”。
磁贴与通知
Metro 风格应用的磁贴与 Windows Phone 7 的动态磁贴(Live Tile)类似,不过还存在一些差异。更多有关使用 C++、C# 或 Visual Basic 的 Metro 风格应用中的磁贴使用,请参阅创建磁贴。
通知是 Windows Phone 7 中推送通知模型的扩展。更多 Metro 风格应用中通知使用的详细信息,请参阅发送消息条通知。
在使用C++、C# 或 Visual Basic 的 Metro 风格应用中使用磁贴、消息条和通知的更多信息与教程,请参阅使用磁贴、徽章和消息条通知。
数据应用场景
Metro 风格应用目前不包含对数据密集型应用场景(如业务线)的内置支持。例如,没有用于客户端 SQL 的 API 并且没有本地数据库。但是,利用定制服务与 OData 调用,仍然可从网络对数据进行检索,并且利用客户端 LINQ 可对数据进行形状与格式化处理,同时可利用基于 XAML 控件可进行绑定。
数据绑定大部分保持不变。例如,可部署 INotifyPropertyChanged 和 INotifyCollection,可相应地接收更改通知与更新 UI。但是,Metro 风格应用的数据相关功能当前还存在以下限制:
◆对数据项验证和 IDataErrorInfo 和 INotifyDataErrorInfo 接口,未提供内置支持。
◆Binding 类未包含 Silverlight 中可用的扩展格式化属性。但是,仍可部署 IValueConverter 已提供定制格式化。
◆IValueConverter 方法将语言字符串作为参数而不是 CultureInfo 对象。
◆CollectionViewSource 类未对于工作的排序、过滤和分组分别提供内置支持。更多信息,请参阅“使用 XAML 进行数据绑定”和“数据绑定示例”。
导航
为了与平台进行集成以及利用硬件“后退”按键,Silverlight for Windows Phone 应用需要使用基于页面的导航结构。对于 Metro 风格应用,提供了类似的导航架构,但是由于平台的要求不同,存在一些差异:
◆在 Metro 风格应用中导航至某个页面时,并未使用 URI 寻址方案,而是指定目标页面的类型,在该页面 XAML 定义的x:Class属性中显示。另外,还可以选择性地传递参数对象。
◆Metro 风格应用的导航框架不支持框架导航、日记(Back 堆栈)修订和 URI 映射。
更多信息,请参阅快速入门:页面间导航。
#p#
将 Windows Phone 7 API 映射至 Windows Runtime API
下表提供 Windows Phone 7 专用 API 与 Windows Runtime API 之间的粗略映射。该表不表示一对一的功能映射;任何平台提供的功能与对应平台都或多或少存在一些差异。