敬告讀者:因為是事件驅動模式的高速學習,高速學習意味着,不系統,不科學,不合邏輯,不一定正確。所以要是有不對的地方,頁面下面留言給我,跪謝!
背景介紹:
最近在公司的開發工作中,接手了從別的公司交代過來的代碼巨怪,其中主要的技術有 WPF,控制反轉框架Spring.net,SqlMap(有點像是ibatis.net),Remoting,作業調度框架Quarz,我們的工作,是把這只怪獸,敲碎,重組並且優化,目標暫時是重構成WebAPI底層和WPF界面兩個部分,下面是我學習WPF的過程中,留下的一些很(luan)有(qi)見(ba)地(zao)的筆記。
筆記:
學習開始的時候,我通常要求自己不要分太多精力去關注一個技術的歷史,英文全稱是什么(Windows Presentation Foundation)這些問題,這個對實際生產,並沒有實際作用,我強烈要求自己只關注怎么開始,並且要開始習慣地用 “問題回答框架”(是什么? 為什么? 怎么樣? )來執行學習作業。
WPF的“是什么”和“為什么”,我認為需要搞清楚幾個事情:
- 明明已經有Winfrom,為什么還要有WPF呢?有什么改進?
- 最直面地,將會用到什么方面的知識呢?
- 同期的技術有什么呢?
1、答:
我是搞Web(asp.net)起家的,Winfrom都不太熟,突如其來的PC界面開發,着實有點措手不及,但是WPF的Xaml界面語言着實讓人眼前一亮,既然是ML類語言,那么Xml,Html的語法和Xaml應該如出一轍的,於是剩下的,馬上就只剩下標簽的熟悉程度問題了,這對Web開發者而言,是個極大的利好消息。
WPF從某個意義上說是很像 Winfrom的,你可以很Winfrom地開發WPF,新建一個WPF解決方案之后,直接拖一個控件(button)到界面上,然后雙擊增加事件。
但是它也可以很網頁地開發某些From,比如想做一個登錄窗口,你必然會想到這樣子的Html代碼:
姓名:<input type="text" id="txtUserName"> 密碼:<input type="password" id="txPassword"> <input type="submit" id="btnSubmit" value="提交">
於是這么看來WPF也提供了這樣一種類似的結構:
<Button x:Name="btnPageEvent" Content="點我!" Margin="441,0,0,0" Click="btnPageEvent_Click"/>
在這一點上Winfrom給我的感覺是特別麻煩,你通常只能通過拖拽的方式添加控件,如果要寫代碼添加,disigner.cs的代碼可讀性真是可以看得人作嘔的,這意味着什么,這意味着,界面的開發和代碼的開發分離了,而且界面代碼的復用能力增強了許多許多。
2、答:
最直面的,當然就是上面提到的Xaml,然后有MVVM框架,然后要像Html+CSS那樣談表現和內容分離,然后要談SilverLight(雖然當前還沒學習到,但是我感覺WPF的動畫是讓人興奮的)
3、答:
WPF有幾個同窗,WCF,WF,新一期的MVC框架等等,都是非常有競爭力,有吸引力的知識和工具。為什么要知道這個呢?因為我一定會把WPF和WCF
接下來怎么樣開始好呢?
首先這不是從頭開始自己開坑,這是別人家公司搞了好幾年的代碼,別人家公司的知(yuan)識(shi)產(ju)權(keng),給你代碼已經很對得起你了,怎么可能有文檔呢?
實踐出真知,當然是要開始寫了,才會懂的,我簡單地整理了下代碼怪獸里面的一些經常出現的控件和單詞,通過書籍《WPF編程寶典:使用C# 2012和.NET 4.5(第4版)》,我簡單地將他們分到了以下幾個類別里面:
- WPF的基本控件(Button,Radio,CheckBox,DataGrid,等等) //(大家都要有的啦!)
- WPF的布局控件(Grid,StackPanel,Border等等) //(布局這個單詞在PC的軟件上看見是件值得讓人感動的事情)
- 元素的綁定(Binding,ObservableCollection) //(MVVM的ViewModel綁定操作)
- 元素的外部資源,樣式或者轉換器(StaticResource) //(表現和內容分離)
- 事件的觸發器(Triggers,EventTrigger,ICommand)
嗯,於是問題來了,我發現經常會有這樣的寫法:
1 Style="{StaticResource SimpleButton}" 2 CommandParameter="{Binding ElementName=gdTaskList, Path=SelectedItem}" 3 Binding="{Binding CreateTime, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource dateTimeConverter}}"
這時候我不禁不斷得吐槽,這都什么鬼啊……
- => Binding里面還套着一個Json格式的對象,對象里面還有一個Binding?
- => StaticResource,這是哪里的Resource?哪里引入進來的呢?
- => Mode, UpdateSourceTrigger, Converter都哪里來的屬性,自己帶的么?
- => Converter 你又調皮了,怎么又帶上一個StaticResource了,這不元素樣式的資源么?怎么跑來轉換器這了?
不,不能再繼續下去了,這樣是很凌亂的。人家是大團隊,人家絕對不是傻瓜,畢竟是幾年的代碼,再亂,都有它的章法。我們要暫時放下工作上的這一切,學習一點基礎知識才對:
MVVM:
這個東西可能對於傳統的程序員們而言會有點難理解,大家都非常習慣MVC的一套,用戶向Controler提出請求,然后Controller把View和Model結合在一起帶到用戶面前;也非常喜聞樂見地用三層開發。
(我的學習順序或許有點非主流,我是先學習了Web上面的Knockout.js,對MVVM有一個初步的了解,再學習的WPF。)
我是這么理解MVC和MVVM的:
我們做的頁面,我們取出來的數據,分別是兩個對象,對於MVC來說,我們看到的頁面和數據,是Controller從數據中一個一個地找到對應的屬性,並且貼到View對應的地方去的,注意是一個一個地找到;而對於MVVM而言,我們看到的頁面和數據,就是預先標記好這里要填寫什么的頁面,然后把數據啪的一下,疊在頁面上面。
可能說的不清晰,我舉個例子吧,不知道讀者小時候有沒有見過很老式的投影儀(膠片投影機,見上圖),不過現在基本都配備了高級的投影儀和實物投影,我小時候上課的時候,老師會把習題先寫在一張透明的膠紙上,然后拿另一張膠紙疊在習題的上面,寫上答案。上課的時候老師先把寫着習題的一張投影出來,大家做練習,然后,再把寫着答案的一張疊在習題的上面,這樣就可以對答案了。嗯,我這里講的就是“疊”的這個操作,這個操作給我的感覺其實很像MVVM的綁定操作。
建立項目:
只有3.5的.net FrameWork才有WPF的,所以代碼開發工具最好是2010以上(大家快去下載2015的community版本吧,免費的咯)。
新建項目,就是 文件->新建->項目...
嗯,這個倒是難不倒我……
結束:
嗯,我們還沒有寫一句代碼,就結束了,
確實幾個月的收獲也不止這么一點,
是的,飯要一口口吃的,筆記也要一點點整理的,
但是我覺得還是開了個好頭的,
起碼對我來說是的……