多樣、互動的WinForm UI設計與開發思路(Flash、Html等)
最近一年來一直在做WinForm相關的系統,對WinForm的UI設計有一些想法想和大家討論(主要是比較忙,所以很多隻是設想,還沒有開發執行個體)
關於WinUI,理想的情形應該是外觀比較cool,能給使用者良好的使用體驗和印象,同時又兼顧功能強大和容易開發。但基於傳統的.NET WindowsForms,恐怕除了容易開發,在其他方面的指標都很普通了。如果為了介面和功能,則複雜度會提高很多,用大量的GDI+和API操作,相 信會讓很多人頭痛不已。
以下是一些思路:
|
| Custom Control |
寫代碼定製控制項 |
| Shell Style |
利用Shell Style工具 |
| Flash Control |
利用Flash控制項 |
| Html Control |
利用Html控制項 |
|
編程來實現各種樣式的控制項,這個是大家比較熟悉和常用的方法,也是上面提到過的。我們現在集中來講解一下後面三種。
Windows Shell Style
不知道大家在厭倦了Windows預設的表單和菜單後,是不是用過一些改變Windows外觀的軟體,例如StarDock公司的很多產品(WindowBlinds總知道吧)以及TGTSoft的StyleXP。
事實上微軟在Win2000,XP,2003系統上均引入了Visual Style的概念,也就是系統外觀主題。它提供了一些API,可以方便地修改Windows表單和控制項的整體外觀呈現。所以我們一般在改變Windows 的主題後,一般大部分程式的按鈕、形狀都會跟著改變(在.NET中可能需要將控制項的FlatStyle設成System並且 EnableVisualStyles()才會有效)
這裡要提的是TGTSoft的StyleXP工具,它基於Windows Visual Style架構,同時又有自己的API,此外,它還有其他一些優點,比如它的每種外觀樣式,全部打包在一個DLL檔案中,同時還有相應的工具 (StyleBuilder)來製作這些樣式DLL。
在安裝完StyleXP後,我們可以在"C:\WINDOWS\Resources\Themes\主題名稱\shell"目錄中找到該主題的DLL檔案。
|
| StyleBuilder讓你定製自己的Windows外觀 |
有了這些基礎,我們就可以在我們的程式中利用ShellStyle的API來應用這些外觀樣式,通過載入不同的資源DLL,就可以輕鬆改變軟體的外觀。當然這種方式中,你所使用的控制項還是傳統的Windows控制項,所以還是有一定局限性。
至於如何利用ShellStyle的API,CodeProject上有一個不錯的例子:Themed Windows XP style Explorer Bar
Flash Control
我們知道Flash的出現和廣泛流行都是由於Web環境,但Flash發展到今天,其功能已不單單局限於Web。我這裡提出的一種思路就是把Flash作為控制項應用在WinForm中。微軟研究院的Wallop就是完全用的Flash。
我們首先來看一下這種實現的技術前提:
| 1 |
Macromedia提供了Flash Player的ActiveX控制項,可以直接嵌入到WinForm |
| 2 |
Flash本身提供了和Web環境類似的表單控制項(TextBox,Button..) |
| 3 |
Flash提供了和外界的資料交換功能,可以通過FSCommand向外發送事件 |
| 4 |
Flash內部可以使用ActionScript(一種類似JavaScript的指令碼)控制其內部行為 |
| 5 |
Flash對Http和Xml有良好的支援 |
| 6 |
Flash支援WebService |
如果你以前不瞭解或熟悉Flash,當你看到這麼多激動人心的特性後,大腦裡已經迸發出各種思想的火花了?Flash不僅可以協助我們在 WinForm裡實現各種強大的互動功能,而且可以藉助於WebService,實作類別似於SmartClient的富用戶端(SmartClient既 不算胖也不算瘦用戶端吧)^^
我們再來看一下除了以上幾點,Flash真正吸引我們解決文章前面提到的問題的一些特性:
| 1 |
Flash基於流傳輸,非常小巧並且嵌入瀏覽器 |
| 2 |
純Flash可以做到跨平台 |
| 3 |
Flash在動畫效果和使用者互動上的強大表現力 |
| 4 |
Flash動態互動效果的容易實現(相對於WinForm編程來說) |
HTML Control
既然可以在應用程式中使用Flash,那麼在其中使用HTML頁面呢?當然可以,事實上這並不是一種新做法,比如微軟,就在相當長時間裡都在 它的軟體裡廣泛使用這種技術,例如MSN。在應用程式中嵌套HTML,好處自然就是可以把Application做得像Web一樣,一個網頁的外觀可以做 到哪種程度,你的控制項,表單也可以做到哪種程度。我們在一個網頁上用HTML代碼、Table表格、Form表單,各種圖片以及CSS搞出來的漂亮介面, 在WinForm中靠代碼達到相同效果可是很大的工程。而對這些介面的調整,在html裡也許很方便的改一片和css,在WinForm中可能相當於 重寫控制項。以上這些都是促使我們使用Flash Control或者Html Control的重要原因:開發、修改其內容和外觀樣式都很方便。
在WinForm中嵌套HTML,就目前來說我們只能用COM組件WebBrowser,在.NET裡用起來不是很方便。
關鍵問題在於,我們這裡討論的WebBrowser和HTML Control是作為軟體系統的控制項或其一部分,而並不是單純的瀏覽器作用。也就是說,我們首先在乎的是其介面,然後是其互動性,也就是這些HTML Control的容器要能夠訪問和控制這些HTML的內容和行為。
在WinForm裡取得Html裡的控制項屬性是比較容易的,但你有沒有想過嵌套在你的WinForm裡的HTML,仍能夠訪問WinForm裡的對象呢?看看LostINet的這篇文章:
結合 MSHTML 與 WebBrowser 產生美觀實用的 WinForm 應用程式。
由於WebBrowser通過Navigate()方法來訪問某個指定的HTML頁面,所以這個頁面的位置無非以下幾種情況:
1, 遠程Web伺服器,例如 http://www.tempuri.org/somepage.htm 或者 http://www.tempuri.org/somepage.aspx
2. 本地Web伺服器,例如 http://localhost/somepage.htm 或者 http://localhost/somepage.aspx
3. 本地檔案系統,例如 D:\mysoft\welcome.htm (只能是靜態頁面了)
這樣的一個問題就是,當你發布你的軟體時,這些HTML需要一起發布,而且是完全暴露在使用者面前。有沒有辦法把HTML一起打包呢?
WebBrowser需要瀏覽一個url,這沒錯,但這個Web伺服器能不能在我們的軟體啟動時,被虛擬建立出來呢?其實我們可以使用
System.Web.Hosting.ApplicationHost.CreateApplicationHost()方法建立我們自己的Web宿主環境。
它其實是把一個本地目錄作為根虛擬目錄,然後在記憶體裡開闢一個新的ApplicationDomain來充當Web宿主。在這個 AppDomain裡我們又可以通過 HttpRuntime.ProcessRequest(new SimpleWorkerRequest(page, query, writer)) 來處理某個請求。而這個Web宿主環境還既可以運行靜態HTML,也可以運行ASP.NET:) 也就是說我們可以用ASP.NET來開發我們的WinForm控制項,而我們的軟體內嵌了一個小型的ASP.NET伺服器。
在這裡我們可以把所有的頁面都作為資源嵌入到你的軟體裡,然後在啟動並執行時候自動把它們都釋放到一個臨時目錄,然後讓WebBrowser直接存取這個目錄,或者啟動你的Web宿主,訪問它提供的虛擬路徑。
有沒有更好的辦法呢?我想就是自己寫一個複雜的Web宿主,能夠直接從資源檔中讀取HTML,而不是通過虛擬目錄。這樣的話我們就可以把所有用到的頁面,甚至整個網站打包到一個DLL了:)