如何將Windows Phone應(yīng)用移植到Windows 8平臺(tái)
譯文【51CTO譯文】相對(duì)而言,使用 C++、C# 或 Visual Basic將 Microsoft Silverlight 應(yīng)用從 Windows Phone 移植至 Metro風(fēng)格應(yīng)用是非常容易的。大部分的工作內(nèi)容,所需的知識(shí)以及體驗(yàn),將轉(zhuǎn)向使用 XAML 的 Metro風(fēng)格應(yīng)用的模型,許多 XAML 界面設(shè)計(jì)與布局也是如此。
應(yīng)用移植工作主要包含兩部分:
◆修改 UI,利用Windows Metro 風(fēng)格 UI 的功能與設(shè)計(jì)指南;
◆從代碼隱藏文件中調(diào)用的Silverlight API 轉(zhuǎn)向相應(yīng)的 Windows Runtime API。
很多情況下,代碼保持不變,或幾乎不變。雖然存在一些差別,但 Windows Runtime 中基于 XAML 的 UP API 是在 Windows Phone 版本的 Silverlight 上進(jìn)行建模。另外,可使用 Metro 風(fēng)格的 .NET API,這是完整的 .NET Framework 的子集,與.NET Framework for Silverlight 類似。在某些情況下,類似的.NET API已轉(zhuǎn)移到Windows Runtime,只是設(shè)計(jì)有稍許不同。
成功移植應(yīng)用所需的工作量主要取決于:應(yīng)用是否使用了大量 API,而這些 API 并未包含在 Metro 風(fēng)格應(yīng)用的 Windows Runtime 和 .NET API。本文提供了一些常規(guī)的移植指南與資源,用于定位 API 并確定多少代碼必須進(jìn)行替換。
本文主要關(guān)注的是 Windows Phone 應(yīng)用的移植,不過,對(duì)于任何 .NET 和基于XAML 的項(xiàng)目,可在以下主題中找到有用的相關(guān)信息:
將Silverlight 或 WPF XAML/代碼移植到Metro風(fēng)格應(yīng)用
Windows Phone 7應(yīng)用移植準(zhǔn)備工作
在進(jìn)行 Windows Phone 7 應(yīng)用移植之前,請(qǐng)考慮以下相關(guān)事項(xiàng):
◆是否需要對(duì)應(yīng)用進(jìn)行快速移植或獲得更佳的可維護(hù)性?“提高可維護(hù)性”部分提供了一些技巧,可用于對(duì)項(xiàng)目進(jìn)行單源處理,并且有助于針對(duì)不同平臺(tái)的項(xiàng)目間代碼再利用。
◆Windows Phone 7 設(shè)備分辨率在水平模式在為水平模式下為800x480 (WVGA),垂直模式下為480x800。Windows 8 Release Preview 設(shè)備可具有多種長(zhǎng)寬比,多種可能的水平與垂直分辨率。界面與資產(chǎn)如何進(jìn)行擴(kuò)展?相關(guān)信息。
◆Windows Phone 7 界面為觸摸式的。Windows 8 界面也應(yīng)支持觸摸,同時(shí)還需支持其他輸入方式,如鼠標(biāo)和鍵盤。對(duì)于某些未使用觸摸的用戶,你的界面是否感覺很笨拙?無論何種輸入方式,如何保持應(yīng)用的可用性?相關(guān)信息,請(qǐng)參閱“可訪問性計(jì)劃”。
◆Windows Phone 7 應(yīng)用中是否具有手機(jī)專業(yè)的功能?想法了解Windows Runtime 中相對(duì)應(yīng)的網(wǎng)絡(luò)技術(shù)?如果對(duì)手機(jī)或提供商提供更多功能支持,那么可能需對(duì)其進(jìn)行重新開發(fā),提供更多的網(wǎng)絡(luò)或提供商獨(dú)立性。
◆游戲應(yīng)用是否依賴用于圖形渲染的 Microsoft XNA 組件?如果是,對(duì)于 Windows 8 應(yīng)用無法使用 XNA。另外,對(duì)于托管代碼,無法有效地使用 DirectX;如果未使用第三發(fā)托管 API,那么必須使用 C++ 進(jìn)行 DirectX 游戲開發(fā)。有關(guān)更多信息,請(qǐng)參閱“創(chuàng)建DirectX游戲”。
常規(guī)移植過程
如果為了優(yōu)化上市時(shí)間,需快速移植應(yīng)用,請(qǐng)遵循以下步驟:
1.打開 Microsoft Visual Studio Express 2012 RC for Windows 8,使用C++、C# 或 Visual Basic 新建 Metro 風(fēng)格應(yīng)用。選擇應(yīng)用布局與功能最為匹配的項(xiàng)目模板。有關(guān)更多信息,請(qǐng)參閱“使用模板(C++、C#、Visual Basic)快速創(chuàng)建 Metro 風(fēng)格應(yīng)用”。
2.復(fù)制想要在新項(xiàng)目中再利用的文件夾、代碼與資產(chǎn)文件。
3.在 Visual Studio 的“解決方案瀏覽器”(Solution Explorer),單擊“顯示所有文件”(Show All Files)。
4.選擇已復(fù)制的文件與文件夾,然后右鍵單擊并選擇“包含在項(xiàng)目中”(Include In Project)。
5.執(zhí)行全局搜索與替換,將“System.Windows”替換為“Windows.UI.Xaml”。
6.將原始 XAML 代碼中可重用部分復(fù)制到新項(xiàng)目的 XAML 文件,或新建的 XAML 文件(如需要)。通常,頁(yè)面布局根(典型的示例:Grid 元素)可進(jìn)行復(fù)制并重用,而最外層元素(如 PhoneApplicationPage 元素)并非如此。
7.構(gòu)建項(xiàng)目,生成錯(cuò)誤,然后這些錯(cuò)誤找到需進(jìn)行更新或替換的代碼。有時(shí),所需的這種更新非常少,只是對(duì)參數(shù)類型進(jìn)行更改。但有些更新需要使用 Metro style 所用的 Windows Runtime API 替代 .NET API。為了確認(rèn)支持哪些 API,可使用本文與“Metro 風(fēng)格應(yīng)用 .NET 概述”以及“將 Silverlight 或 WPF XAML/代碼移植到 Metro 風(fēng)格應(yīng)用”,獲取相關(guān)指南。
8.對(duì)于任何無法輕易進(jìn)行更新的代碼,請(qǐng)進(jìn)行評(píng)注或清除,直到項(xiàng)目構(gòu)建。
9.一次對(duì)評(píng)注代碼的一個(gè)問題進(jìn)行更新或替換,直到移植完成。
#p#
提高可維護(hù)性
為了多個(gè)平臺(tái)上的應(yīng)用維護(hù)變得更加容易,請(qǐng)考慮使用以下技巧:
◆在移植之前,請(qǐng)對(duì)代碼進(jìn)行重構(gòu),使其盡可能可重用。尤其,通過應(yīng)用設(shè)計(jì)模式,如將業(yè)務(wù)邏輯與 UI 邏輯分開的Model-View-ViewModel (MVVM),可避免 UI API 差異方面的問題。使用 MVVM,模型與視圖模型代碼在不同平臺(tái)上可保持大部分不變,同時(shí)視圖代碼(XAML)可根據(jù)平臺(tái)定制。
◆在項(xiàng)目之間共享可重用代碼文件,而不是維護(hù)針對(duì)不同平臺(tái)的多個(gè)副本。如需在 Visual Studio 中進(jìn)行此類操作,請(qǐng)“解決方案瀏覽器”(Solution Explorer)中右鍵單擊該項(xiàng)目,選擇“添加已有項(xiàng)”(Add Existing Item),選擇共享文件,然后單擊“添加為鏈接”(Add As Link)。
◆如需在共享文件中包含某些平臺(tái)專用代碼,請(qǐng)使用條件編譯。這種方式僅適用于 C#、C++ 和 Visual Basic 代碼。對(duì)于 XAML,必須對(duì)分開的代碼文件進(jìn)行分別維護(hù)。
◆使用 Portable Class Library 創(chuàng)建跨平臺(tái)的庫(kù)程序集。該可移植類庫(kù)包含 .NET Framework for Silverlight、Metro 風(fēng)格應(yīng)用 .NET API 和完整的 .NET Framework 中可用 .NET API 的子集。可移植類庫(kù)是與全部三個(gè)平臺(tái)兼容的二進(jìn)制文件,因此對(duì)于代碼重用是最為簡(jiǎn)單的方式。不過,為了創(chuàng)建針對(duì)可移植類庫(kù)的項(xiàng)目,必須使用 Microsoft Visual Studio Professional 2012 RC 或更高版本。
#p#
移植用戶界面
Silverlight 的大多數(shù)布局類型,如Canvas、Grid和StackPanel,在 Windows Runtime XAML 命名空間里也會(huì)出現(xiàn)。雖然為了適應(yīng)多種高于 800x480 的分辨率,Grid 和布局設(shè)置需要進(jìn)行調(diào)整,但基本用戶界面結(jié)構(gòu)的移植應(yīng)是直接式的。
當(dāng)然,手機(jī) UI 可能專門為小屏幕手機(jī)而設(shè)計(jì)。簡(jiǎn)單地對(duì)其繼續(xù)擴(kuò)展并非最佳設(shè)計(jì),應(yīng)根據(jù) Metro 風(fēng)格應(yīng)用的功能以及 Windows 8 設(shè)備的多種形狀因素對(duì) UI 進(jìn)行重構(gòu)。這種功能之一為分屏視圖(snapped view),對(duì)此手機(jī) UI 設(shè)計(jì)可能是有用的。
更多信息與設(shè)計(jì)指南,請(qǐng)參閱以下主題:
◆制作優(yōu)秀的 Metro 風(fēng)格應(yīng)用
對(duì)定義應(yīng)用布局的 XAML 文件進(jìn)行調(diào)整之后,需要更新隱藏代碼,以使用 Windows Runtime API 替代 Silverlight API。對(duì)于用戶界面元素,在兩個(gè) API 庫(kù)之間存在相當(dāng)一致的映射。
以下為 Windows Runtime XAML 命名空間,大體上與對(duì)應(yīng)的 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 |
請(qǐng)注意,以下 Silverlight XAML 命名空間在 Windows Runtime 中不具有直接的對(duì)等項(xiàng):
◆System.Windows.Ink
◆System.Windows.Media.Effects
◆System.Windows.Messaging
#p#
使用 XAML 的Silverlight 與 Metro 應(yīng)用之間的不同
雖然對(duì)于 Windows Phone 7 和 Windows 8,Metro 風(fēng)格 UI 是相同的,但在兩個(gè)平臺(tái)的 UI 的功能之間還存在一些差異。以下部分對(duì)其中一些關(guān)鍵的不同進(jìn)行了描述。不過,為了確定具體支持哪些功能,應(yīng)查詢 API 引用。更多關(guān)于使用 XAML 的 Metro 風(fēng)格應(yīng)用信息,請(qǐng)參閱“采用 C# 或 Visual Basic 的 Metro 風(fēng)格應(yīng)用的路線圖”。
控件與布局
Windows Runtime 中的 XAML 控件是基于 Silverlight 控件的,但可能存在一些差異或缺少某些功能。例如:
Windows Runtime 未包含 Silverlight for Windows Phone 中提供的 Pivot 和 Panorama 控件。這些控件專門為手機(jī)形狀因素而設(shè)計(jì),有助于提升比手機(jī)屏更大屏幕上的用戶體驗(yàn)。Metro 風(fēng)格應(yīng)用通常具有更大的屏幕空間,并且應(yīng)利用具有更大靈活性的 Grid 控件的優(yōu)勢(shì)。另外,還可以使用 FlipView 控件來提供簡(jiǎn)潔的翻頁(yè)體驗(yàn)。
Windows Runtime 中的 AppBar 控件提供的體驗(yàn)與手機(jī) ApplicationBar 類似,不過具有更多的靈活性,支持定制布局與數(shù)據(jù)綁定。
Windows Phone 可聲明支持何種設(shè)備旋轉(zhuǎn)方式,因此能夠?qū)Ρ匦璧牟季朱`活性進(jìn)行限制。對(duì)于 Metro 風(fēng)格應(yīng)用,UI 設(shè)計(jì)應(yīng)不受設(shè)備選擇方式與屏幕尺寸的限制。
更多關(guān)于控件的信息,請(qǐng)參閱“功能控件”。
磁貼與通知
Metro 風(fēng)格應(yīng)用的磁貼與 Windows Phone 7 的動(dòng)態(tài)磁貼(Live Tile)類似,不過還存在一些差異。更多有關(guān)使用 C++、C# 或 Visual Basic 的 Metro 風(fēng)格應(yīng)用中的磁貼使用,請(qǐng)參閱創(chuàng)建磁貼。
通知是 Windows Phone 7 中推送通知模型的擴(kuò)展。更多 Metro 風(fēng)格應(yīng)用中通知使用的詳細(xì)信息,請(qǐng)參閱發(fā)送消息條通知。
在使用C++、C# 或 Visual Basic 的 Metro 風(fēng)格應(yīng)用中使用磁貼、消息條和通知的更多信息與教程,請(qǐng)參閱使用磁貼、徽章和消息條通知。
數(shù)據(jù)應(yīng)用場(chǎng)景
Metro 風(fēng)格應(yīng)用目前不包含對(duì)數(shù)據(jù)密集型應(yīng)用場(chǎng)景(如業(yè)務(wù)線)的內(nèi)置支持。例如,沒有用于客戶端 SQL 的 API 并且沒有本地?cái)?shù)據(jù)庫(kù)。但是,利用定制服務(wù)與 OData 調(diào)用,仍然可從網(wǎng)絡(luò)對(duì)數(shù)據(jù)進(jìn)行檢索,并且利用客戶端 LINQ 可對(duì)數(shù)據(jù)進(jìn)行形狀與格式化處理,同時(shí)可利用基于 XAML 控件可進(jìn)行綁定。
數(shù)據(jù)綁定大部分保持不變。例如,可部署 INotifyPropertyChanged 和 INotifyCollection,可相應(yīng)地接收更改通知與更新 UI。但是,Metro 風(fēng)格應(yīng)用的數(shù)據(jù)相關(guān)功能當(dāng)前還存在以下限制:
◆對(duì)數(shù)據(jù)項(xiàng)驗(yàn)證和 IDataErrorInfo 和 INotifyDataErrorInfo 接口,未提供內(nèi)置支持。
◆Binding 類未包含 Silverlight 中可用的擴(kuò)展格式化屬性。但是,仍可部署 IValueConverter 已提供定制格式化。
◆IValueConverter 方法將語(yǔ)言字符串作為參數(shù)而不是 CultureInfo 對(duì)象。
◆CollectionViewSource 類未對(duì)于工作的排序、過濾和分組分別提供內(nèi)置支持。更多信息,請(qǐng)參閱“使用 XAML 進(jìn)行數(shù)據(jù)綁定”和“數(shù)據(jù)綁定示例”。
導(dǎo)航
為了與平臺(tái)進(jìn)行集成以及利用硬件“后退”按鍵,Silverlight for Windows Phone 應(yīng)用需要使用基于頁(yè)面的導(dǎo)航結(jié)構(gòu)。對(duì)于 Metro 風(fēng)格應(yīng)用,提供了類似的導(dǎo)航架構(gòu),但是由于平臺(tái)的要求不同,存在一些差異:
◆在 Metro 風(fēng)格應(yīng)用中導(dǎo)航至某個(gè)頁(yè)面時(shí),并未使用 URI 尋址方案,而是指定目標(biāo)頁(yè)面的類型,在該頁(yè)面 XAML 定義的x:Class屬性中顯示。另外,還可以選擇性地傳遞參數(shù)對(duì)象。
◆Metro 風(fēng)格應(yīng)用的導(dǎo)航框架不支持框架導(dǎo)航、日記(Back 堆棧)修訂和 URI 映射。
更多信息,請(qǐng)參閱快速入門:頁(yè)面間導(dǎo)航。
#p#
將 Windows Phone 7 API 映射至 Windows Runtime API
下表提供 Windows Phone 7 專用 API 與 Windows Runtime API 之間的粗略映射。該表不表示一對(duì)一的功能映射;任何平臺(tái)提供的功能與對(duì)應(yīng)平臺(tái)都或多或少存在一些差異。
API 類型 | Silverlight API 命名空間 | Windows Runtime API 命名空間 |
設(shè)備 | Microsoft.Devices, Microsoft.Devices.Radio, Microsoft.Devices.Sensors |
Windows.Devices.Enumeration, Windows.Devices.Enumeration.Pnp, Windows.Devices.Input, Windows.Devices.Sensors |
Windows Phone 應(yīng)用模型與環(huán)境 | Microsoft.Phone, Microsoft.Phone.Info, Microsoft.Phone.Notification, Microsoft.Phone.Reactive, Microsoft.Phone.Shell, Microsoft.Phone.Tasks |
Windows.Networking.PushNotifications, Windows.Devices.Sms, Windows.ApplicationModel.Background, Windows.ApplicationModel.Contacts, Windows.ApplicationModel.Contacts.Provider, Windows.ApplicationModel.Core |
映射 | Microsoft.Phone.Controls.Maps, Microsoft.Phone.Controls.Maps.AutomationPeers, Microsoft.Phone.Controls.Maps.Core Microsoft.Phone.Controls.Maps.Design Microsoft.Phone.Controls.Maps.Overlays, Microsoft.Phone.Controls.Maps.Platform | Windows.Devices.Geolocation |
商城 | Microsoft.Phone.Marketplace | Windows.ApplicationModel.Store |
網(wǎng)絡(luò)與聯(lián)合 | Microsoft.Phone.Net, Microsoft.Phone.Net.NetworkInformation | Windows.Networking, Windows.Networking.BackgroundTransfer, Windows.Networking.Connectivity, Windows.Networking.NetworkOperators, Windows.Networking.Sockets, Windows.Web.AtomPub, Windows.Web.Syndication |
編程與數(shù)據(jù)模型 | System | Windows.Foundation, Windows.Foundation.Collections, Windows.Foundation.Metadata, Windows.Data.Xml.Dom, Windows.Data.Xml.Xsl, Windows.Data.Json |
位置 | System.Device.Location | Windows.Devices.Geolocation, Windows.Networking.Proximity |
自動(dòng)化與診斷 | System.Diagnostics, System.Windows.Automation.Peers | Windows.Foundation.Diagnostics |
圖形(3D 轉(zhuǎn)換) | XNA Framework Class Library, Content Pipeline Class Library |
No equivalent at this time. |
控件與UI 基礎(chǔ)結(jié)構(gòu) |
Microsoft.Phone.Controls, |
Windows.UI.ApplicationSettings, Windows.UI.Core, Windows.UI.Input, Windows.UI.Notifications, Windows.UI.ViewManagement |
存儲(chǔ) | System.IO.IsolatedStorage class | Windows.Storage, Windows.Storage.FileProperties |