這是8個系列教程的第八部分,這系列示范如何使用Silverlight 2的Beta1版本建造一個簡單的Digg客戶端應用。這些教程旨在按順序閱讀,幫著解釋Silverlight的一些核心編程概念。
使用WPF創建一個Digg桌面應用
這最后一個教程的目的與前面7個有點不同。我們實際上不將在本教程里在Silverlight中運行代碼,而是將使用WPF和.NET 3.5。我們將拿我們編寫的,在瀏覽器中運行于Silverlight中的現有的Digg應用代碼,重用它來以Windows桌面應用的方式運行。
隨Silverlight發布的是一套與.NET 框架完整版本相兼容的API子集。這么做的目的就是允許開發人員學習一個共同的編程模型和工具集,能夠在RIA web應用,豐富的Windows桌面應用和Office解決方案之間重用學到的技能,代碼和內容。
下面是我采取的步驟,來重用我們現有的Digg Silverlight應用代碼(運行于瀏覽器中),來建造一個Windows桌面應用的版本(運行于瀏覽器外)。
第一步:創建一個新的WPF桌面應用
我們先開始使用VS 2008創建一個新的WPF桌面應用。我們將之命名為“DiggDesktopSample”:
這會在VS中創建一個項目,內含2個文件,一個App.xaml,一個 Window.xaml:
注意,這個項目的結構與我們在本系列教程的第一篇里創建的Silverlight應用的結構非常類似(擁有一個App.xaml 文件,一個 Page.xaml 文件)。
第二步:把現有的Digg應用的代碼拷貝進WPF應用中
我們將把現有的DiggApplication Silverlight代碼拷貝/粘貼進我們的新DiggDesktopSample Windows項目中:
目前在Beta1版本中,這個拷貝/粘貼是個手工步驟,我們最終將有一個自動化的方式來在不同項目類型間移動代碼。
第三步:修正幾個問題
我需要做2個改動,才能使我們現有的Digg例程代碼被成功編譯:
1) Silverlight Beta1 XAML定義的命名空間 xmlns:URL與完整的WPF桌面版本不同。我需要改動我拷貝進新項目的XAML文件指向完整WPF的定義。這是在發布前我們還正在研究的東西。
2) 我需要把<<WaterMarkTextBox>控件改成<TextBox>,把 <HyperlinkButton> 控件改成<TextBlock>。這2個控件是Silverlight Beta1 版本中新有的,不存在于完整的WPF版本中(但我們會在將來添加它們)。但我不用改動跟這些控件相關的任何代碼,也不用改動網絡調用,LINQ to XML, 或數據綁定代碼。
做完這些小改動后,項目就可以干凈地編譯了。
第四步:把Digg應用宿主與桌面窗口中
然后我打開桌面項目中的Windows1.xaml 文件(它是在應用啟動時裝載的默認窗口)。
我把窗體的標題改成“Digg Desktop Version”,擴大了窗口默認的寬度和高度。
然后我把來自前面的Digg Silverlight 項目中的Page.xaml 用戶控件加到窗口中作為根控件。這在窗口裝載時,會載入該控件并使之可見。我不用改動Page類的代碼,或者對其中的東西改名。因為是從UserControl繼承而來,它是完全可以宿主于任何WPF窗口或控件中的。
我改動的最后一樣東西是因為Digg REST API 服務器會試著檢測是否是非瀏覽器/服務器在訪問它,有時會在這些情形下給予一個拒絕訪問的回復(大概是防止自動腳本訪問他們的服務)而導致的一個問題。我通過讓網絡訪問經過一個代理URL解決了這個問題(沒有代碼變動,只是URL改動)。
第五步: 運行應用
然后,我能夠運行我們新的DIgg桌面應用。所有的功能都跟Silverlight的版本一樣工作,應用的行為也完全一樣:
在從列表中選擇一個故事后,細節用戶控件顯示為:
瀏覽器版本和桌面版本間有幾個細微的樣式區別。這主要是因為WPF在默認情形下繼承了基于當前用戶選擇的操作系統主題的默認樣式(字體,顏色,卷動條等等),而Silverlight 則有一個我們在所有操作系統上都使用的默認主題。如果我們要使得桌面版本和瀏覽器版本絕對一致,我們可以在我們的樣式和控件模板中更明確地指定,否則的話,桌面版本會基于用戶的OS主題做稍微的變動。
結語
我們會在將來推出在Silverlight和WPF項目之間共享代碼的更詳細的注意事項和推薦的最佳實踐指南。我認為你會發現你在建造Silverlight應用時學到的技能和知識可以很好地轉移到完整的WPF的項目中去。我們也致力于一個非常高的兼容水平,能在解決方案間促進好的代碼重用,促進控件,內容和代碼的輕松共享和利用。
希望本文對你有所幫助,