Wpf開源收集


1,到底有哪些開源MVVM框架?

  前面介紹了WPF的基本概念和一些相關知識,我們了解到開發WPF應用程序可以使用現成的框架和模式,最為合適的莫過於時下正熱的MVVM模式,所以這里我們也列出針對MVVM模式的已有開源框架:

2010-10-31 22-51-52

                                             圖3

  上面除了WPFToolKit和MEF之外都是一些常用的MVVM框架,連帶自己開發的一共是八個,所以自己也取了一個響亮的名字——MVVM 八大框架!聖殿騎士本人實際項目中只用到了三個框架,之前WPF使用過MVVM Helpers,在Silverlight項目當中用過MVVMLight+MEF,后來就一直使用自己開發的框架,其他框架也研究了很長時間,但都是為了開發MVVM框架借鑒之用。框架雖然眾多,但萬變不離其宗,通用功能如下:

1,Model、View 和 ViewModel之間的關系:View和ViewModel如何關聯起來(IOC)以及如何通信(通常采用Message),ViewModel和Model之間的弱關聯(通常采用接口或者簡單注入)。

2,事件驅動模式在MVVM模式采用Command和Attached Behaviors的形式。

3,屬性及ViewModel的NotifyPropertyChanged處理。

4,提供完整的單元測試,這也是保證框架的穩定性和維護性的保證。

  也許有一些朋友會問我為什么要研究這么多框架,其實做項目只需要認真研究並實踐其中一個就行,研究它們的原因則主要歸功於自己開發MVVM框架的需要。下面就讓我們來看一下具體有哪些MVVM的開源框架(具體到每一個框架后面有時間再闡述,一篇文章寫得確實很累):

2,最強大且功能最多的組合框架——Prism

下載地址:http://compositewpf.codeplex.com/

開發者:微軟patterns & practices團隊

是否支持Silverlight:是

學習資料:Composite Application Guidance for WPF and Silverlight - May 2010.chm以及Quickstarts和StockTraderRI等。

源碼截圖如下:

2010-10-6 23-54-02 

                                             圖4

  Prism——之前又叫Composite Application Guidance for WPF and Silverlight,它是構建復雜的基於WPF/Silverlight企業級應用的主流框架。Prism中有幾個比較重要的概念:

1,BootStrapper:應用程序切入點,繼承Prism的UnityContainer或MEF提供的MefUnityContainer,為系統提供一個容器。

2,Shell:它是一個外殼,通過UI元素和Region布局頁面。 它是應用程序的頂級窗口,顯示的內容一般就由View來填充,Shell本身並不知道它包含了哪些內容,所以功能則是由各個Module來具體提供。

3,View:它等同於MVP模式、MVVM模式中的View。可以通過IRegionManager注入到Region中。

4,Module:可以把一個大項目拆分開來,每一個Module都包含View、數據、模型,主要用於實現復雜業務操作。

5,IModuleManager:主要用於管理模塊加載,可以實現動態加載。

6,IEventAggregator:事件處理接口,實現訂閱和發布模式,這也是MVVM框架的一般做法。

  Prism是一個比較龐大的組合框架,4.0引入MEF及功能調整以后變得更加強大了,現在可以說是組合框架和應用框架的統一體,而且是微軟團隊的力量,所以選它是值得保證的。

3,最強大且功能最多的應用框架——Caliburn

下載地址:http://caliburn.codeplex.com/

開發者:Rob Eisenberg

是否支持Silverlight:是

學習資料:我主要參考項目實例、源碼、單元測試用例、國外一些博客和社區。

源碼截圖如下:

2010-10-31 22-50-51

                                             圖5

Caliburn中有幾個比較重要的概念:

1,在Actions基礎上的Commands帶有很多功能,其中包括多參數、過濾操作以及異步調用。

2,窗體和控件的生命周期事件也處理得比較好(包括activation、deactivation、shutdown等)。

3,不管是整個框架還是基於這個框架的應用程序的可測性都比較好。

4,提供了很多常用功能,這些在項目當中都比較有用。

5,除了支持MVVM模式之外,還很好的支持MVP模式以及其他的一些變種模式。

6,強大的依賴注入框架以及AOP框架,這里可以靈活選用其中一種。

Caliburn是一個非常強大的MVVM應用框架,對很多功能都提供了靈活且多種實現,不論是項目使用還是研究代碼,感覺都受益頗多。

4,輕量級且適用的MVVMLight

下載地址:http://mvvmlight.codeplex.com/

開發者:Laurent Bugnion

是否支持Silverlight:是

學習資料:除了online documentation,我主要參考項目實例、源碼、單元測試用例、國外一些博客和社區。另外這三篇文章非常不錯,用MVVMLight開發了一個比較完整的Silverlight企業項目

源碼截圖如下:

2010-10-21 16-22-04

                                             圖6

MVVMLight中有幾個比較重要的概念:

1,RelayCommand:通過對Command進行封裝,使得MVVM模式在WPF和Silverlight上更加容易。你只需要在 ViewModel中定義好各個RelayCommand,然后在View中通過Command來綁定ViewModel中定義好的 RelayCommand,就可以實現像WinForm、ASP.NET事件一樣的效果,只不過這里是解除了UI和邏輯的強耦合。

2,Messager:MVVMLight中的Messager作用比較大,前面講了MVVM模式解除了ViewModel和View的強引用,那么它們如何來進行交互呢?就是靠它來讓ViewModel和View來進行通信的。一般我們會定義一個靜態AppMessages類來作為通用的一個通信類,原理就是發布訂閱模式。

3,EventToCommand:這里就比較類似於附加行為的概念,是在MVVM Light Toolkit V3中開始引入的概念。

4,ICleanup接口:當顯示某個View時,需要先調用Cleanup方法清除數據,這也是由於ViewModel和View的耦合隔離產生的一些必要操作。

  MVVMLight是一個非常好用的MVVM框架,提供了VS和Blend的模板及智能感知。它結合MEF使用真的感覺很輕量級且高效,而且提供了WPF和Silverlight的支持,尤其在Silverlight的支持上比較好,所以一般選擇輕量級的Silverlight MVVM模式,它比較被看好。

5,功能齊備且易用的MVVM Helpers

下載地址:http://mvvmhelpers.codeplex.com/

開發者:Mark Smith

是否支持Silverlight:否

學習資料:http://www.julmar.com/blog/mark/以及提供的實例、源碼及測試用例。

源碼截圖如下:

2010-10-21 16-25-14

                                             圖7

MVVM Helpers又叫JulMar MVVM Helpers + Behaviors,其中有幾個比較重要的概念:

1,提供了MVVM模式的基本功能,包括ViewModel、View及Model之間的隔離,另外還提供了一些常用功能。

2,ViewModel的創建使用標簽的形式注入,現在也可以引入MEF。

3,IOC/DI的支持,屬性都有驗證機制,Wait Cursor的支持,當使用完viewmodel之后能及時釋放,這樣避免內存泄露。

4,提供了常用的Attached Behaviors支持。

5,消息機制的引入,避免強引用產生的耦合。

MVVM Helpers是一個非常適用的MVVM框架,尤其是提供了MVVM常用功能+MEF+Attached Behaviors,所以項目中的問題基本都能解決。

6,功能強大且輕巧的Cinch

下載地址:http://cinch.codeplex.com/

開發者:Sacha Barber

是否支持Silverlight:否

學習資料:http://sachabarber.net/以及提供的實例、源碼及測試用例。

  1. A walkthrough of Cinch, and its internals - Part I
  2. A walkthrough of Cinch, and its internals - Part II
  3. How to develop ViewModels using Cinch
  4. How to Unit test ViewModels using Cinch app, including how to test Background work threads which may run within Cinch ViewModels
  5. A Demo app using Cinch

源碼截圖如下:

2010-10-21 16-34-31

                                             圖8

如果仔細研究其代碼,你會發現它和上面講的MVVM Helpers有很多相似的代碼,估計是相互參考了一番:-D。Cinch 中有幾個比較重要的概念:

1,這個框架在沒有MEF出現之前就已經實現了ViewModel和View之間的強引用隔離,它既沒有一般IOC的配置,也沒有IView來做中轉,並且窗體和控件的生命周期事件也處理得比較好,所以在這方面來說是非常不錯的。

2,提供了常用的Attached Behaviors支持,另外也提供了一些MVVM常用功能。

3,DI/IOC使用Unity實現,多線程的實現,避免系統出現不可預料的錯誤。

4,當使用完viewmodel之后能及時釋放,這樣避免內存泄露,驗證機制的加入,常用導航實現。

5,消息機制的引入,避免強引用產生的耦合。

Cinch 是一個非常強大的框架,尤其是它比較着眼整個應用程序的搭建,所以也比較受到青睞。

7,功能簡單且易擴展的MVVMFoundation

下載地址:http://mvvmfoundation.codeplex.com/

開發者:Josh Smith

是否支持Silverlight:否

學習資料:http://joshsmithonwpf.wordpress.com/以及提供的實例、源碼及測試用例。

源碼截圖如下:

2010-10-21 16-22-57 

                                             圖9

MVVMFoundation中有幾個比較重要的概念:

1,Messenger:這里主要用在各種不同的ViewModel之間通信(比如相互關聯的ViewModel、主從ViewModel等),當然也可以擴展成ViewModel與View之間進行通信。

2,ObservableObject:這里相當於ViewModelBase的概念,每一個ViewModel繼承自該類,調用完成之后立即釋放,防止內存泄露。

3,PropertyObserver:主要是對INotifyPropertyChanged.PropertyChanged進行封裝,這樣封裝可以精簡代碼,同時可以防止不當操作引起的內存泄露。

4,RelayCommand接口:封裝command的聲明,包括execution執行邏輯,可選的can-execute邏輯等。外部只需要實例化並Binding就可以簡單使用。

MVVMFoundation是一個非常簡單的MVVM框架,如果你覺得研究源碼比較困難,就可以先從這個框架入手,代碼簡單而且精煉。

8,附加:支持插件式的依賴注入MEF

下載地址:http://mef.codeplex.com/

源碼截圖如下:

2010-10-21 16-20-52 

                                             圖10

9,如何充分利用這些框架

  上面我們已經介紹了七大MVVM框架+支持插件式的依賴注入MEF,其實另外這三個框架WPF Application Framework (WAF)CalciumCoreMVVM(Basic MVVM framework)也很值得研究,由於時間和精力的關系,針對這三個框架聖殿騎士也沒有進行仔細的剖析,只是粗略看了一下基本功能。

其他一些框架諸如OnyxnRouteNito MVVMOceanGoodLight就沒有太多關注,有興趣的朋友也可以選擇其中某一個或多個框架作為研究和學習,不過還是推薦研究主流的框架,畢竟這些主流框架的開發團隊和成熟度都比較強。

上面看到了這么多MVVM框架,那么我們應該怎么去學習和使用呢?簡單來說可以歸納為以下幾句話:

1,根據具體的項目選擇適合的框架,團隊和項目有大有小,所以得根據這些來選擇具體的框架,其實終歸來說,幾個框架功能都比較類似。

2,框架不用研究太多,只要適用於項目就行,尤其是熟練使用並根據其提供的TDD測試代碼追溯其原理。

3,框架不是萬能的,對於某些應用和功能可以對框架擴展,這也開源最大的好處之一。

針對框架的研究,自己也總結了幾點:

1,首先看框架的相關介紹,了解相關的背景、功能、架構圖以及其他一些相關信息——認識了解。

2,根據介紹查看並調試框架所提供的實例——熟悉功能。

3,自己寫一些相關的項目,主要是熟悉該框架,如果說要急於做項目,后面就可以把框架引入到項目當中——具體使用。

4,根據該框架提供的詳細單元測試研究其源碼,這也是我最喜歡研究這些開源框架的原因——原理剖析。

5,通過上面的步驟認真分析其原理及細節——准備重現。

6,自己也根據之前的思路重復開發這個框架,最好能用TDD——框架復原捷徑。

  上面我們談了一些開源框架相關知識,下一步我們得自己開發一個MVVM框架,一方面是對知識的總結,另一方面也是對知識的再提煉,同時也能使自己的認識提升到另一個高度,緊接下文。

十. 自己開發MVVM框架

  由於之前自己做了一套框架,但是還沒有趨於完善,所以暫時不准備共享出來(主要是WPF和Silverlight版本更替比較頻繁且沒有加入模板及智能感知)。對於開發一套MVVM框架,具體需要做一下幾個操作:

1,要能解決Model、View和ViewModel之間的強關聯,這也是核心功能,尤其是View和ViewModel,不管是使用IOC Container還是MEF都行。

2,命令和附加事件的處理,對Command進行封裝,滿足多參數、方法過濾、泛型、異步回調等,對附加事件進行封裝,使它像使用命令一樣簡便。

3,由於View和ViewModel是弱關聯或者是無關聯,如何讓它們進行通信?這就需要加入Messenger機制。

4,前面引入了消息機制(一般是靜態化處理),如何來管理、實例化、清除消息呢?這里得建立一套消息機制。

5,由於前面采用了弱關聯或者無關聯,並且引入了消息機制,所以需要對操作有日志記錄,否則出了問題無法快速定位及追查原因。

6,如何統一管理ObservableObject、PropertyObserver等這些對象呢?所以得自己建立一套變更體系。

7,對常用功能及操作進行封裝,提供一些常用類庫以及UI Helper等。

  總之,開發MVVM框架不能求全,只要適合項目就行,也不要想一次就能完善整個框架,在使用時不斷根據需求擴展才是明智之舉。另外附加三點開發MVVM框架心得:

1,充分借鑒其他開源框架,研究各個框架的不足和優勢,然后把思想貫穿於自己的框架中,當然有些常用功能代碼也可以直接借鑒過來。

2,對於這樣一個比較龐大的框架,使用TDD+反復重構無疑會提高開發效率,同時也能提高框架的可維護性和穩定性,這也是團隊使用的一個前提。

3,框架會使用一些常用設計模式,有了它們可以讓框架更具有擴展性,同時也減少了開發成本、增加了可維護性。比如觀察者模式(消息的發布、訂閱、觸發)、中介者模式(直接通信的類轉化為中間類來處理,隔離耦合)、外觀模式(提供一個簡單的接口出來,在內部進行大量的封裝,這樣就可以起到易用且功能強大的目的)、裝飾模式(原來已經穩定的功能模塊,如果在不改變原有結構的基礎上進行擴展,無疑這是一個很好的實踐)等。

----------------------------------------------------------------------------------------

 

以下是各種開源控件,就不介紹了。

Fluent Ribbon Control Suite


Microsoft Ribbon for WPF


AvalonDock


PropertyEditor for WPF


WPF Property Grid


PropertyInspectorView


WPF Dynamic Data Display


Swordfist WPF Charts


WPF Toolkit


AvalonEdit

 

 

wpf學習資源站點:http://www.cnblogs.com/KnightsWarrior/archive/2010/11/01/1866641.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM