WPF的學習筆記(1) -- (積累自2016年5月1日 至 2016年6月1日)


敬告讀者:因為是事件驅動模式的高速學習,高速學習意味着,不系統,不科學,不合邏輯,不一定正確。所以要是有不對的地方,頁面下面留言給我,跪謝!


背景介紹:

最近在公司的開發工作中,接手了從別的公司交代過來的代碼巨怪,其中主要的技術有 WPF,控制反轉框架Spring.net,SqlMap(有點像是ibatis.net),Remoting,作業調度框架Quarz,我們的工作,是把這只怪獸,敲碎,重組並且優化,目標暫時是重構成WebAPI底層和WPF界面兩個部分,下面是我學習WPF的過程中,留下的一些很(luan)有(qi)見(ba)地(zao)的筆記。

筆記:

學習開始的時候,我通常要求自己不要分太多精力去關注一個技術的歷史,英文全稱是什么(Windows Presentation Foundation)這些問題,這個對實際生產,並沒有實際作用,我強烈要求自己只關注怎么開始,並且要開始習慣地用 “問題回答框架”(是什么? 為什么? 怎么樣? )來執行學習作業。


WPF的“是什么”和“為什么”,我認為需要搞清楚幾個事情:

  1. 明明已經有Winfrom,為什么還要有WPF呢?有什么改進?
  2. 最直面地,將會用到什么方面的知識呢?
  3. 同期的技術有什么呢?

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版本吧,免費的咯)。

新建項目,就是 文件->新建->項目...

嗯,這個倒是難不倒我……

 

 

結束:

嗯,我們還沒有寫一句代碼,就結束了,

確實幾個月的收獲也不止這么一點,

是的,飯要一口口吃的,筆記也要一點點整理的,

但是我覺得還是開了個好頭的,

起碼對我來說是的……


免責聲明!

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



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