小序:
Hi,大家好!幾乎兩個月沒有寫技術文章了。這兩個月,我在學習WPF。回顧一下兩個月的學習曆程,有兩個感覺——第一,WPF是一項非常實用又簡單易學的東西,它将成為未來MS平台上快速開發的主流趨勢;第二,WPF的學習比較講求路徑,如果沒有一個比較好的路徑,學習起來可能比較慢,主要原因是它像是一種ASP.NET與Windows Forms的“雜交品種”,裡面有很多内容與前兩者似像非像,同時還有很多新内容的引入。
本系列文章的主要目标是:幫助大家學習WPF技術,快速成為這項技術的開路先鋒。在此,我借CSDN一塊寶地,把這兩個月來學習到的東西做一個整理,奉獻給大家。希望大家能喜歡。BTW,本系列文章的風格将一改以前長篇累牍的樣式,改變為非常短小的篇幅,每篇文章一兩個知識點,小步快跑、天天積累。這樣,我寫着不累,你看着也不累。
在我兩個月的學習中,我的同僚們——Anstinus、 Mathew、 Allen、 ChengSong、 Edward和Mike——他們像戰場上的戰友一樣給了我無數的幫助。在這裡,我向這些同僚表示深深的感謝和敬意。還有我的搭檔——大美女Yan,和你在一起工作很開心。
正文:
什麼是WPF
WPF,Windows Presentation Foundation也,譯過來就是“Windows呈現基礎”,你看它的目的非常明确,就是用來把資料“顯示”給使用者看的(說白了就是用來做UI的)。如果隻是給使用者顯示幾串文本、兩三張圖檔或者幾個表格那WPF就太糗了,幸乎,WPF可不是這等素食動物——大家都見過Flash動畫吧,WPF的顯示能力絲毫不亞于Flash以及Flash的同門師弟Flex+AIR(某建築公司産品)。
為什麼會有WPF
“微軟出點兒什麼新東西,我就得跟着跑!”我也曾這樣抱怨過。不過,當大量的工作任務壓在頭上的時候,我終于感覺到——每一次技術(包括理念、架構、語言、工具)的更新都帶來了巨大的工作效率提升。的确,我們需要花些時間來搞懂那些看起來亂糟糟的新概念,但搞明白之後——坦白地講,在有人帶的情況下,這并不是什麼難事——我們就能用非常少的代碼來換取先前技術大量代碼才能獲得的功能。似乎代碼量是開發團隊中一切糟糕問題的罪魁禍首,so,明白了?
對于WPF是如何減少代碼量的,後面有一個例子。但WPF絕不是一個隻能幫我們減少代碼量的家夥,更重要的是,它還能幫我們把程式的界面和功能邏輯近乎徹底地剝離——in a nutshell,把你的程式變成一隻香蕉或者橘子——“皮”是可以從“瓤”上剝下來的,一旦某天使用者說:“這個橘子能不能看起來像是個香蕉?”你就可以為你的橘子瓣兒裹上漂亮的進口香蕉皮再開出一個更漂亮的價碼。
WPF是怎樣做到的
使用WPF技術開發産品,程式的“皮”,也就是UI,是使用XAML語言來“畫”出來的;而程式的“瓤”,也就是功能邏輯,可以由程式員來選擇使用C#/VB.NET/C++.NET等托管語言來實作。
對于程式員們來說,C#/VB.NET/C++什麼的已經是耳熟能詳。XAML是什麼呢?簡言之,XAML(讀音為“zamel”,近似于“咋沒有”)是XML語言的一個衍生物,它的文法基本上與XML語言完全一緻;它的功能就是專門用來設計和實作程式的UI;它看起來和HTML語言非常像,無論你是程式員還是美勞工員,隻要你設計過網頁,那學習XAML對你來說都是小菜一碟兒。而且,XAML可不像HTML和XHTML那樣隻能呆在Web開發領域——XAML對于Web開發和桌面開發是“通吃”的,從Web程式改成桌面程式或者反過來,所付出的工作量驚人的小,而且由于UI與邏輯完全分離,邏輯代碼幾乎不用改動——這意味着兩種開發的邊界漸漸消失,兩類設計人員和程式員将會染指“彼岸”、拿到更多的項目、掙更多的錢。
WPF之前,無論是Win32 API程式設計、使用MFC程式設計還是Windows Form程式設計,美工(設計人員)設計出來的界面都需要由程式員使用Visual Studio來實作。程式員不是美工,VS也幹不過PS……越俎代庖永遠是高效分工的大敵。如今,為了支援WPF程式設計,微軟推出了專門的、使用XAML語言進行UI設計工具——Expression Studio,使用它就像使用PhotoShop和Dreamweaver一樣,設計出來的結果儲存為XAML檔案,程式員可以直接拿來用;當UI有變更時,程式員隻消用新版XAML檔案替換舊版即可。
XAML小試牛刀
讓我們實作這樣一個小小的需求,完全使用XAML代碼而不需要C#來參與。使用者需要一個視窗,裡面有一個TextBox和一個Button,并且視窗的背景是藍色的過渡色。
我保證:真的一行C#代碼都沒寫!是不是足以讓Windows Form程式員豔羨不已?!
一切實作都是使用XAML語言完成的——你可以使用Visual Studio 2008的XAML設計器來完成,也可以使用Expression Studio來更專業地完成設計。下面是它的XAML代碼,你現在隻需要看個大概,後面的文章裡,我會一個詞一個詞為你解釋。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"Height="300"Width="300">
WPF
咱們再來一個例子:這回的需求是這樣的——UI上有一個TextBox和一個Slider,要求Slider的滑塊滑動時TextBox的文本顯示Slider的值;當TextBox裡的文本改變時,就讓Slider的滑塊與之同步。
對于一個有經驗的Windows Form開發老手來說,他的思路是這樣的:
在UI上拖放控件
為Slider的ValueChanged事件添加響應函數(事件處理函數),函數中将Slider的Value屬性(double類型)轉換成一個string類型的值并賦給TextBox的Text屬性。
為TextBox的TextChanged事件添加響應函數,對TextBox的Text屬性進行檢驗,看看它是否能解析為一個double值(新手常常忘記這一點而導緻bug)并且落在Slider的取值範圍内,如果一切順利,就把它賦給Slider的Value屬性。
Now,你是一個WPF新手,但你可以做的比一個Windows Form老手還好!請打開Visual Studio 2008,建立一個WPF Application,然後把下面的代碼copy到XAML設計器裡。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"Height="300"Width="300">
看你,你也可以一句C#代碼都不寫就完成漂亮的程式!
我猜已經有同學開始“暈代碼”了。完全沒有必要!這些代碼80%都是VS自動生成的,而且它們的結構的非常簡單——箱子裡裝着一個口袋,口袋裡裝着兩個核桃。上面這段程式最重要的一句就是:Text="{BindingElementName=slider1,Path=Value,UpdateSourceTrigger=PropertyChanged}",即可以說它是WPF最精華的部分,也可以說它是與Windows Form開發相比變化最大的地方,它就是——Data Binding(資料關聯)。這兩個月來,我幾乎天天與這個東西打交道。後面的文章中,我們将仔細學習如何使用它。
TO BE CONTINUE...