這倆年多來筆者一直在從事關於WPF的開發。雖然不能說是專家級別的。但是對於WPF的應用還是有一定的了解。論他的靈活性決對不在WinForm之下。WPF的出現更是引發一段熱議。他的何去何從更是讓很多人感到迷茫。因為那個時候可以說只有Winow 7才能跟WPF完美的接合。可惜他出不逢時,XP占了大部分的市場。所以WPF的出生動靜很大,可惜后力不足,漸漸的淡淡化他的光芒。於至於網絡上更是有對WPF的死亡產生了很大的爭議。但是這並沒有讓他沉默下去,這幾年來window 8和window 10的推廣更是讓他起來的跡象。對於未來WPF會發展到如何的程度。筆者也不敢猜測。更多的只是希望他能走的更遠一點。
如果WPF沒有WinForm所具有的優點,那么他也不可能活到現在,更不用說還有可能崛起了。所以筆者想開一個系列來談談這倆年的WPF之旅。希望能給那些正在學習WPF或是將要學習的同學們帶來一些幫助。出於筆者本身的學習方式有一點不正統的原因,所以這一系列的文章只能被定義為雜談。
曾經有一個剛剛從事WPF的同事問筆者靜態資源和動態資源有什么不同。筆者傻了幾秒反問到什么是靜態資源,什么是動態資源。這次談話的結果可想而知——很尷尬。為什么筆者會不知道靜態資源和動態資源呢?事實上筆者沒有看過相關的WPF書籍。那么筆者又是如何學習WPF呢?一句話——看開源項目的源碼進行學習。本來筆者想把這一系列命名為“WPF 開源項目”。后來想想有一點自大了,同時筆者也不知道這一系列要以什么樣子知識路線來講解。所以命名"WPF 雜談"顯示平淡一點,又可以讓筆者自由的吹牛。
以前用於開發商業軟件的技術有Winform(C#),MFC(C++), Swing(JAVA),Delphi。現在.NET又都出了一個WPF。即然有Winform了,為什么.NET又要在來一個WPF。筆者曾經有想過這樣子的問題。可惜筆者就一個懶人,后面也沒有細細的去查找原因。WPF的靈動是筆者深深喜歡的優點之一。和WinForm比起來筆者只知道他們的圖形引擎不一樣子。這還是從一些書籍里面看到的。WinForm是基於User32/GDI/GDI+,而WPF是基於DirectX引擎的。不用筆者多說就明白了——DirectX常常會在開發游戲的時候聽到。所以WPF可以做到很多不錯的動畫效果。這也是Winform所不能做到。哦!不。應該說是很難做的。但是筆者到現在還是沒有多大的應用動畫效果。主要是筆者從事餐飲行業。餐廳里面的電腦配置不敢拘同。516內存的XP系統是一種常態。如果你用上動畫的話,你注定要為動畫的BUG和運行性能買單。這說明了一問題WPF需要有一定的配置環境。從.NET Framework來講,還是.NET 4.0來的開好一點。因為這樣子XP,Window 7,Window 8還是Window 10都可以做到共用。
筆者之所以可以很快的上手WPF。這里要深深的感謝那些把自己的項目開源出來的人。這一點國外的開發人員還有做的很不錯。WPF有很多知識點在國內是無法百度到的,所以想要學好WPF還是要去搞一個VPN或是自己想辦法跳牆過去。
SharpDevelop
SharpDevelop是一款用C#開發的開發工具。這是筆者第一個接觸的WPF項目。對於源碼筆者也只是看過部分。當年筆者是從事JAVA開發的。對於JAVA的OSGI思想很感興趣。也曾試着尋找有沒有.NET大神寫一些類似的框架。只是可惜太少了,有的也是半成品不是真正的OSGI。不過.NET有一個自己的想法——插件思想。這也是筆者查看他源碼的原因。他雖然沒有OSGI的思想,可是筆者對他的插件實現還是有一定的興趣的。所以有興趣的讀者們可以試着去看一下。好吧。有一點遠了。SharpDevelop他可以說是WPF和Winform的組合體。他有一部分是WPF實現。而有一些卻是用Winform。當然讀者們會想着這樣子也行。不怕出問題嗎?問題是不會太大。只是筆者還是建議不要這樣子用。鬼知道他們倆個將來會什么樣子。當然如果只是一次項目的話,為了方便到是可以這樣子做。反正項目做完就是拜拜了。不用維護。SharpDevelop有一點大,想要吃通他的話,需要一定的時間和精力。不過他真的是一款學習PC端開發的最佳開源項目之一。
SharpDevelop的下載地址:https://github.com/2594636985/SharpDevelop。
Xceed.Wpf.Toolkit
Xceed.Wpf.Toolkit是一個框架。他自定義一些常用的組件。比如加載提示框。復雜的列表。 Xceed.Wpf.Toolkit只有表現層用到的知識,沒有什么業務邏輯,所以學習起來還是比較易容的。不像上面SharpDevelop那樣子。還要結合WinForm。他的源碼筆者大部分都看過了。那么我們要學習他的什么呢?當然學習他如何實現用戶自定義化組件的。現在他又更新了新的版本。不過很多源碼沒有什么變化。命名習慣還是那樣子讓筆者很不喜歡。但是不得不說他是進入WPF用戶自定義組件最佳導師。初級的WPF學習者可以看這個開源項目。
Xceed.Wpf.Toolkit下載地址:http://wpftoolkit.codeplex.com/
Modern UI for WPF
筆者由了上面倆個項目的經歷之后,又遇到了WPF生命中的最佳戰友——Modern UI for WPF開源項目(又稱mui)。正如上面所講的筆者一直在查看插件思想。而Modern UI for WPF不管是在對WPF的實現上,還是在編輯思想上絕對是良作。如何你學習了Modern UI for WPF又研究了他的源碼。那么你可以很輕易的改動他的框架來實現你做需要的架構。可以這樣子講Xceed.Wpf.Toolkit是面向WPF的深度。而Modern UI for WPF可以說是廣度。你學習組件知識可以選Xceed.Wpf.Toolkit。如果你想學習如何開發WPF的話Modern UI for WPF不二人選。你可以從源碼中看到如何切換界面。如何實現界面之間的交互。並且你還可以看到如何排版資源。
Modern UI for WPF下載地址:https://github.com/firstfloorsoftware/mui
MaterialDesignInXamlToolkit
當我遇到MaterialDesignInXamlToolkit開源項目的時候,我才知道原來WPF還可以做到這么好的效果。如果MaterialDesignInXamlToolkit是一個好動的年青人的話,那么Modern UI for WPF無疑就是一個經歷過歲月的老人。MaterialDesignInXamlToolkit在動畫和美工上做了很大的功夫。可惜筆者卻無力消受。該死的餐飲行業。每一個按扭的動畫效果足以讓你美美的睡上一覺。美中不足的是作者用的是4.5.2以上的.NET Framework語法進行編寫。所以你可能要手動的修改回來。變成4.5或是4.0。至少筆者是這樣子做的。同后面的代碼習慣讓筆者嘆了一口氣。這也沒有規則了吧。
MaterialDesignInXamlToolkit下載地址:https://github.com/ButchersBoy/MaterialDesignInXamlToolkit
MahApps.Metro
和MaterialDesignInXamlToolkit一樣子,可惜在筆者看來他沒有MaterialDesignInXamlToolkit來的效果,又沒有Modern UI for WPF在大體上表現出眾。可以說MahApps.Metro對學習WPF來講比較平穩。沒有過多的亮點。可能筆者有了上面三個開源項目的經歷之后。在去看MahApps.Metro顯示有一點知識疲勞。所以筆者一般只是把他當作小情人來看待。如果上面三個開源項目都沒有找到筆者需要的時候,才會去找MahApps.Metro。
MahApps.Metro下載地址:https://github.com/MahApps/MahApps.Metro
筆者看了很WPF的開源應用項目。最后留下來也就是這幾個。在后面的開發過程中,筆者也是靠這里個開源項目決解了很多開發上的問題。在開發過程很明顯的感受與Winform有着根本上的不同。最大的體現是WPF的引入了MVVM模式開發。為此還出現了很多開源的MVVM框架。其中最出名有Prism、MvvmLight等。很不幸的是筆者都沒有用過。不是筆者不想去用。而是覺得用了,在一定程序上會減少了WPF的靈活性。如果要推存的話,筆者會選擇Caliburn.Micro開源項目。對於Caliburn.Micro的應用到是有一個開源的小項目。讀者們可以去了解一下——gemini。
筆者的學習方式也很簡單就是看源碼。可以說筆者的WPF之旅就是吃源碼之旅。不知道大家跟筆者是不是一樣子的。后面的文章沒有出現專業的術語也請大家不要過份的在意。筆者真的沒有看過多少書。幾乎全實戰。