前言
隨着Windows Phone的進一步推廣,微軟也把傳統桌面版本的Windows帶入觸摸的世界,全新的Windows 8破蛹而出。大家對Windows8的關注度遠遠高於當初的Windows Phone。我記得在2010年4月Windows Phone CTP SDK剛出來的時候,研究的人寥寥無幾,我可以算說寫了當時第一個中文系列教程,然而由於CSDN和三星那邊由於WP的上市時間一直推延發布。但是這一次Windows 8的Developer Preview 一出來,好幾個大公司馬上跟進,在Consumer Preview出來的時候,Windows Store已經有好幾個大公司出產的App,例如QQ,人人神馬的。Windows 8的火熱程度必定高於Windows Phone。
由於Windows 8 Consumer Preview的發布,也說明了Windows 8慢慢的成熟,(其實還不成熟,我覺得Consumer Preview的Windows 8還沒有當時Windows Phone CTP 那么成熟。后面會講述到)也開始做一些原型,經過了兩個星期的開發,做出了第一個Windows 8 Metro app的原型。
這是一個//BUILD app和Reader app的混合體,只是一個原型,功能還不完整,只用於演示,但是呈現的元素全部都是數據綁定,旦項目確定,只要修改數據源就能接着進一步開發。同時使用了Semantic Zoom,Grid View,List View等Windows 8的新控件,算是Windows 8開發的初體驗。
Metro app
Windows 8的程序分為傳統桌面程序和Metro App,如下圖。與傳統的桌面程序相比,Metro app是Windows 8全新的概念與開發模式,可以理解為Windows Phone app的Pad版本。
我們還是可以使用當前Windows的開發模式來開發桌面程序,例如WPF,MFC,Silverlight等等,但這都不是本文探討的部分,本文講述Metro app。
Metro app支持三種不同的開發模式,XAML + C#/VB, XAML/DirectX + C++, HTML5 + JS + CSS。理論上講三種方式都是等同的,從我開發的經驗來說,目前最為成熟的是HTML5的模式,控件的bug最少,有些控件,例如Semantic Zoom,HTML5版本要比XAML版本的正常。這也是為什么微軟的app中HTML5 app最多的原因。我也粗略看過微軟自己開發的,或者找實習生開發的app(在Developer Preview中),HTML5的app居多數,而微軟的內置核心app一般都是XAML+C++的模式來開發的。但是我想隨着Windows 8 SDK的進一步完善,最終三種方式開發的效果是一樣的。到底選擇哪個與個人自身條件與喜好相關,我個人的喜好是
C# –> HTML5 –> C++
由於我習慣了開發WPF(Surface)和Windows Phone程序,所以我首選C# + XAML的模式。這種模式后面慢慢講述,現在插播一下其他模式的開發,以便於選型。
DirectX/XAML + C++模式
好處是開發的app不能反編譯,由於Windows 8暫時不支持XNA(也不知道什么時候支持),所以開發游戲的首選是DirectX,而以DirectX作為呈現層的app只能使用C++了。Windows 8內置的app一般都是使用C++開發的,可能出於代碼加密的考慮。
壞處是學習一種非標准的C++,出於個人情緒,我在Windows 8發布第一天就開始在Twitter和微薄上罵那種C++的開發方式,我不喜歡的不是C++,而是微軟擴展的C++。其實我非常喜歡標准的C++,但是對微軟的那種擴展C++一直沒什么好感,大概在7,8年前,開始使用VS2003開發擴展C++程序,大概有幾萬行的代碼,最后由於性能原因,把全部的托管(managed) C++代碼全部移植回原生(native) C++,我甚至走的更遠,除了迫不得已的情況下,絕不使用MFC,都以STL來代替。
因此除非有性能要求很高的程序,否則我不會輕易選擇C++的開發模式。
HTML5+CSS+Javascript模式
Javascript可以說是世界上給人誤解最大的語言,Objective C可以說是給人誤解第二大的語言了,其實他倆兄弟挺慘的,一直給人罵,但其實都是功能強大,以一敵三的語言。但C#是一敵十的神馬級別語言,所以我也不選擇Javascript的模式,C#在手,萬事無憂。如果大家仔細看微軟的例子程序,Windows Store上的app,目前大部分的app都是以javascript開發的,例如Kindle,kobo等閱讀器程序,//Build程序,而且Kindle還是沒有混淆過的,很好的學習例子呀。而Developer Preview的//Build也公開的源代碼,可是微軟把api改了,原版本的程序不能啟動了,但代碼還是值得參考的。
微軟說上述三種模式都是直接調用WinRT,沒有區別,但是經過我測試,我覺得性能上還是有區別的,例如Semantic Zoom在HTML5版本下的性能明顯要比C# XAML版本要差,這也是我決定不選擇HTML5的原因。
其實這個HTML5可以說是微軟版本的HTML5,對HTML技術熟悉的人都知道,HTML5還是Draft版本,每個廠商都實現其自己的HTML5,使用一大堆prefix tag,例如-webkit- -ms-神馬的,Windows 8也不例外,嚴格來說還是在玩微軟的HTML5,而且由於Javascript和HTML太強大了,編程模式太靈活,微軟的HTML5模式就像山寨XAML的模式,一堆數據綁定。警告說HTML,JS的數據綁定不是微軟特有的,市面上也有一堆MVVM和MVC庫,例如knockoff等等,但是為Windows 8開發的開發HTML app,可移植性不高。也就是說可以進不可出。你明白的,呵呵。
但是我覺得這個模式還是不錯的,我可能在將來選擇這種模式進行開發。
以上都是一家之言,歡迎狂噴,我會根據自己的知識re噴,呵呵。
XAML,還是XAML
前文再續書接上一回,回到我心愛的C# + XAML。一言以蔽之:Windows 8的C# + XAML就像WPF版本的Windows Phone。XAML功能比Silverlight更強大,控件更豐富,然后加入一些Windows Phone獨立存儲空間的概念,生命周期的概念。因此如果熟悉WPF,Silverlight或者Windows Phone的開發,進入Windows 8的XAML + C#模式的開發將會非常容易。最關鍵的核心概念還是那些:數據綁定,依賴屬性,StoryBoard動畫,項控件,這些都是一樣的。Consumer Preview還加入神器Blend,極大簡化XAML的編輯難度。
Async
Async是新版C#的新功能,為了提高用戶體驗,不讓用戶有等待的感覺(其實還是需要等待的)WinRT所有的api都變成Async了。如果對於Windows 8 Metro app的開發來說,Async是不得不學習的功能。其實就兩個關鍵字async和await,學習曲線非常低。Async的引入是為了簡化異步編程的開發模式,把Callback編程的復雜度減低,讓開發者按照順序的思維來開發程序,編譯器把async和await兩個關鍵字封裝成相應的Task,然后通過線程池來自動管理異步調用。對於開發者來說是減輕任務。
部署程序
如果要把Metro部署到Windows 8設備上,不需要解鎖的,首先需要在Windows 8的設備安裝Remote Debugger。然后啟動Remote Debugger,把它設置為“不需要用戶驗證”。在開發機上點擊“Remote Machine”, 選擇Windows 8設備的IP就可以部署了。不像其他手機或者iPad的開發,只需要網絡啟動就可以了,不需要USB鏈接。
小結
以上都是一些碎碎念,也算是這兩周開發的一些想法,由於Consumer Preview的SDK還是不完善,開發中會遇到一些bug,由於沒有文檔,有時候只能靠自己反編譯一下等手段來解決。但是我覺得隨着版本的升級會慢慢改正,對於這方面我還是對微軟懷有信心的,畢竟不像Android那樣更新快,但breaking api一大堆。本來還想講述UX方面的,這也是Windows 8 Metro開發的大頭,但是構思了一下挺多內容(UI,手勢,用戶習慣,與Android,iOS和WP7的區別,與傳統桌面程序的區別等等),放到下一篇文章《Windows 8 Metro app UX初體驗》。
如果覺得文章OK,請轉到微薄上,也可以通過微博 @林永堅Jake 與我互噴。現在玩Windows 8的筒子不多,如果您也開始做Windows 8,互粉一下,多交流交流,切磋切磋。