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