Wpf開源收集

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

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

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的形式。app

3,屬性及ViewModel的NotifyPropertyChanged處理。框架

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

  也許有一些朋友會問我爲何要研究這麼多框架,其實作項目只須要認真研究並實踐其中一個就行,研究它們的緣由則主要歸功於本身開發MVVM框架的須要。下面就讓咱們來看一下具體有哪些MVVM的開源框架(具體到每個框架後面有時間再闡述,一篇文章寫得確實很累):mvvm

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

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

開發者:微軟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

相關文章
相關標籤/搜索