詳解Silverlight和WPF互相擴展
原創【51CTO.com獨家特稿】1.更適合WPF或Silverlight的場景
WPF被設計為創建Windows桌面應用程序,具有訪問富用戶界面特征,如動畫、3D圖形、音頻和視頻,以及直接訪問圖 形加速硬件以實現更好的圖形性能。由于大部分WPF應用程序是在計算機本地運行,因此不會涉及到象Web應用程序那樣 的安全限制,因此,如果對文件系統有訪問限制的話,WPF應用程序可以只在用戶計算機上存儲少量的數據,同樣,由于 應用程序不用從遠程計算機上下載,這非常適合Microsoft .NET® Framework,可以不用包括創建它時的所有完整特性。
Silverlight 被設計為比WPF更廣闊的擴展,因為它支持多平臺,截至目前,它不僅支持Windows,還支持Mac,Novel 和Linux(Moonlight – 目前和Silverlight 1.0相當,等價于Silverlight 2.0的版本目前也正在開發中 )。
然而,為了實現這個偉大的目標,Silverlight 必須要能夠在各種瀏覽器及不同操作系統環境下能夠運行,這需要在 Silverlight 上增加一些結構性限制,因為在不同系統下對硬件驅動的方式可能不一樣,如Windows下的Direct X®和 Windows顯示驅動模型,它們在Mac和Linux上就沒有。
接下來就是Silverlight 在瀏覽器中的插件的大小了,微軟被要求省略掉.NET Framework中許多特性,否則插件過大 ,其中很多特性又不常用,對用戶而言用處不大,這會影響用戶的下載積極性,正是由于這個限制,Silverlight 短期 內還做不到WPF那么豐富的功能。
在選擇哪種技術更適合項目時,如果考慮圖形加速,或那些只有WPF中才有的特性,或者對性能要求很高時,那選擇 WPF是最恰當的,相反,如果你對性能要求不是太高,同時又想將應用擴展到Mac和Linux平臺時,那只有選擇 Silverlight 了。
2.既適合WPF又適合Silverlight的場景
最開始在WPF下開發的Windows客戶端應用程序可能會擴展到Mac或Linux平臺上運行,例如,當WPF引入時,我創建了 一個XBAP應用程序(XAML瀏覽器應用程序),它包括了我2006年在塞內加爾旅游時拍攝的照片,不幸的是,由于我們的 朋友沒有安裝.NET Framework,因此在它的電腦上不能看到這些照片,通過將這個程序轉換成Silverlight,我的朋友或 那些不想安裝.NET Framework的人都可以輕松看到這些照片了。
在Mike Tucker的博客站點上有一篇很有趣的文章,講的是最初是由Silverlight 創建應用程序,然后又轉換到WPF應 用程序的例子,Tucker在尋找一種方法來調整它的Silverlight 程序性能,但他沒有找到這樣的工具,于是決定創建一 個等價的WPF程序。
Caliburn是一個應用程序框架,它被設計用來幫助開發人員實現不同的模型,如MVC,MVP,Presentation模型(MVVM ),命令和應用程序控制器就是一個同時使用了Silverlight 和WPF開發的程序示例,與此類似,開發人員也想使用這兩 種技術創建自己定制的控制器。
3.WPF和Silverlight 特性對比
由于Silverlight 是WPF的一個大子集,Silverlight 有些特性WPF沒有,而且它們共同的技術特性其實現形式也有所 不同,Vertigo Software的Christopher Vigna允許我們使用下面的簡圖來說明這一點。
圖- 1 WPF和Silverlight 對比圖(2009年二月)
特性集包括依賴屬性、風格和可視化樹是兩者共同的特性,但實現方式卻不一樣
網絡上不缺乏對這兩種技術進行對比的博客文章和論壇討論主題,但由于這兩個技術都處于不停的發展階段,因此, 如果從博客文章去收集整理它們之間的不同之處顯得非常不可靠,因為你看到的博客文章可能已經過時了,如果非要說 的話,那MSDN在線幫助文件可能要算最權威的了,但它也有過期的那一天,盡管如此,它在檢查WPF和Silverlight 當前 的不同之處時還是非常有用的,它不僅說明了在編程時如何處理它們,還對未來這兩者之間可能合并的功能進行了闡述 。
3.1數據綁定
數據綁定可能是WPF給人印象最深刻的特性之一了,Silverlight 2也支持部分數據綁定功能,但有些例外,如 Silverlight 2不支持綁定一個UI元素到另一個UI元素,在WPF中一個經典的例子是Slider綁定到一個TextBox或 TextBlock上;相反,Silverlight 被限制,綁定UI元素只能綁定到標準的.NET對象上,如數值變量(如綁定一個 TextBlock到某個時間點上),Silverlight 也不支持直接綁定到XML上,但在WPF中可以通過XmlDataProvider來實現。
這并不意味著Silverlight 不能將某個UI元素的屬性值鏈接到另一個UI元素的屬性值上,只不過不是通過數據綁定 實現的;如果要在Silverlight 中實現這個鏈接功能,需要開發人員自己編寫事件處理程序,但沒有使用數據綁定那么 省事,WPF也支持事件處理程序。
為了對Silverlight 數據綁定有一個詳細的了解,我建議你閱讀Jesse Liberty和Tim Heuer合作寫的文章(鏈接地址 :http://www.devx.com/RIA/link/38130)。
領會WPF和Silverlight 包含相同的類也很重要,這也并不意味著這兩個類共享相同的成員,例如,下面的圖片說明 了WPF中的綁定類要比等價的Silverlight類具有更多的屬性,最能說明這些不同之處的是Silverlight 瀏覽器插件大小 希望做得非常小,在Silverlight 中缺少某些屬性,如ElementName屬性,正是如此,也解釋了為什么在Silverlight 中 不支持將一個UI元素綁定到另一個UI元素了。
圖- 2 WPF綁定類屬性列表
圖- 3 Silverlight 綁定類屬性列表
3.2觸發器
WPF中的觸發器已經被證明在啟動和停止動畫非常有用,不過遺憾的是,在Silverlight 中幾乎就沒有觸發器, Silverlight 只支持事件觸發器(EventTrigger)和BeginStoryboard行為,由于WPF和Silverlight 一個共同特性就是 都支持動畫,而Silverlight 又缺乏觸發器的支持,因此在那些嚴重依賴動畫的應用程序上,這是一個很大的負面影響 ,Silverlight通過使用VisualStateManager減輕了這個影響,微軟計劃將VisualStateManager移植到WPF,如果真的那 樣的話,Silverlight /WPF開發就可以聯合起來了,應用程序的聯合也就變得更簡單了。
3.3控件支持
目前,WPF比Silverlight 包含更多的控件,Silverlight 中最注目的省略是FlowDocument,ToolBar,ListView, Menu,Context Menu和Ribbon控件,在MSDN幫助文件中詳細列出了WPF有的控件和Silverlight有的控件,還有兩者都有 的控件。
Silverlight 控件開發正在飛速發展,在CodePlex網站上可以看到Silverlight 工具集,這個站點反應了微軟關于 Silverlight 控件新的開發策略,現在已經轉向開源了,目前至少有一打的控件處于開發階段,大部分都處于beta階段 ,很快你就能看到最終發行版了。
3.4 3D圖像
3D圖像在WPF中雖然還沒有得到普遍支持,但在Silverlight 中卻完全沒有支持。
#p#
4.預先規劃你的應用程序
預先規劃應用程序的***步是***確定你該做什么,實際上,在你的解決方案中同時需要WPF和Silverlight ,如果 其中一個或有其它解決方案能夠滿足你的需要,通過只構建一個解決方案而不是兩個,這樣可以大大節約工作量,而且 在只使用一種技術的前提下,你可以充分使用該技術的特性,在同時使用兩種技術的情況下,你需要考慮每個特性的兼 容性。
假設你的確需要這兩種技術,接下來你需要找出WPF和Silverlight 之間的結構化差異對項目的影響,如果WPF和 Silverlight 解決方案都還沒有完全完成,這樣特別有用,通過預先規劃可以減少實現兩個解決方案的工作量,例如, 假設有個項目的實現方法不止一個,其中一個或更多在其它技術中不可用,也可能其中一個或多個在兩種技術中都可用 。一個***的例子就是WPF中的內嵌內容可以使用下列方式實現:
<BUTTON>我的內容 </BUTTON> |
但這種實現在Silverlight 中是不能工作的,一個好的解決辦法是將內容設置為屬性,這樣在兩種技術中都能工作, 如:
<BUTTON Content="我的內容"> |
與此類似,WPF和Silverlight 都支持通過關鍵字引用樣式設置應用程序特定元素的樣式,但只有WPF可以使用 TargetType應用隱含樣式。
接下來最關鍵的就是決定是啟動一個Silverlight 項目還是啟動一個WPF項目,我推薦只有極少例外的情況才使用 Silverlight 項目,因為Silverlight 是WPF的一個子集,你在Silverlight 中實現的應用程序特性毫無疑問可以在WPF 中通過相同的方法或類似的方法實現。
5.聯合開發指南
改善應用程序兩個不同版本之間的長期可維護性的一個絕對有效的方法是在兩個項目之間共享文件,可以在一個項目 中常見文件,然后在另一個項目中創建到該文件的鏈接即可,而不是直接拷貝一份。
圖- 4 添加一個文件鏈接而不復制該文件
在兩個不同的項目之間共享文件不是沒有問題,前面已經說過,在Silverlight 中能夠運行的代碼在WPF中不一定能 夠運行,在某些情況下,可以使用條件編譯來解決這個問題。
#if SILVERLIGHT |
雖然條件編譯只適合后臺代碼而不適合XAML,但幸運的是XAML在這兩種技術之間幾乎沒有不相容的地方。
2009年2月,微軟的模式和實踐組發布了Prism v2,它是一個WPF和Silverlight 混合應用指南,Prism v2由可重用代 碼庫,引用(示例)實現和文檔組成,包括許多快速入門和動手實驗,這些項目的共同目的是幫助開發人員使用WPF或 Silverlight ,或者兩者一起來創建模塊化應用程序,這里的模塊化應用程序指的是由大量分離的,松散耦合的,獨立 的片段組成的程序,這些片段之間是可以相互交互的,這里的前提是這些模塊是可以獨立開發,測試和部署的,而且這 些模塊在之后是可以獨立修改和擴展的。
Prism的初始版本僅僅將目標瞄向WPF,版本2傾向于同時用于WPF和Silverlight ,Prism V2允許在WPF和Silverlight 之間***化代碼共享,而且,引用實現和相關的文檔傾向于提供明確的指南,示例代碼則集中于WPF/Silverlight 應用 程序聯合開發。
6.開發轉換指南
現實中你可能要面對一個已經開發完成或接近尾聲的項目,你的任務是選擇一種技術來實現,這個時候你必須做出決 定,是在現有的解決方案上進行拷貝還是創建一個嶄新的方案,然后再從現有的項目中復制粘貼代碼,創建一個全新的 解決方案有一個好處就是可應用的模板會使用正確的項目設置創建,而修改現有的解決方案可能需要手工修改它們。如 果這是一個一次性轉換,那么從創建一個全新的解決方案開始是個不錯的辦法,如果不是,那你***先強迫自己了解它 們的差異。
7.小結
任何人都希望實現在WPF和Silverlight 之間的無痛快速轉換,但事實上可能會讓人失望,聯合開發需要預先做好規 劃,如果你按照正確的策略和步驟,其實還是相當可行的。
我建議的清單包括以下步驟:
(1) 是聯合開發還是進行轉換,究竟是選擇WPF還是Silverlight,都要仔細評審。
(2) 評審WPF和Silverlight 之間的不同之處,MSDN幫助文件已經詳細列出了它們之間的差異。
(3) 在評審結果基礎之上,決定是WPF還是Silverlight 更適合你的項目。
(4) 對于一個新開發的項目,決定是先創建WPF項目還是先創建Silverlight 項目(一般情況向應該先創建 Silverlight 項目)。
(5) 然后確定在這兩個項目之間有多少文件可以共享。
(6) 仔細考慮這兩個項目之間是否允許有分歧,以便確定是否可以***化使用每種技術的特性。
(7) 對于將一個現有項目要轉換成另一種技術實現,首先要決定是創建一個全新的項目,然后從現有項目中 復制粘貼代碼,還是就在現有項目基礎之上進行轉換。
【編輯推薦】