如何將Windows Phone應用移植到Windows 8平臺
譯文【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 之間的粗略映射。該表不表示一對一的功能映射;任何平臺提供的功能與對應平臺都或多或少存在一些差異。