WPF開發(fā)于WinForm之后休偶,從技術(shù)發(fā)展的角度,WPF比WinForm先進是不容置疑的辜羊。我覺得WPF相比于WinForm有下面的一些較好的特性:
解決Window Handle問題
在Windows GDI或WinForm開發(fā)中復(fù)雜的GUI應(yīng)用程序踏兜,會使用的大量的控件词顾,如Grid等。而每個控件或Grid cell都是一個小窗口碱妆,會使用一個Window handle肉盹,盡管控件廠商提供了很多優(yōu)化辦法,但還是會碰到Out of Memory或"Error Create Window handle"疹尾,而導(dǎo)致程序退出上忍。
WPF徹底改變了控件顯示的模式,控件不在使用窗口纳本,也就不會占用Window handle窍蓝。理論上,如果一個WPF只有一個主窗口的話繁成,WPF只會使用一個Window handle(如果忽略用于Dispatcher的隱藏窗口的話)吓笙。所以WPF GUI程序不會出現(xiàn)Window handle不夠用的情況。
多線程的處理
在WinForm程序開發(fā)時巾腕,最頭疼的一個問題就是面睛,worker線程修改控件的屬性而導(dǎo)致程序崩潰,而且這種非法操作并不是每次都失敗尊搬。WinForm控件提供了InvokeRequired屬性來判斷當(dāng)前線程是不是控件創(chuàng)建線程叁鉴。問題是當(dāng)控件樹很深是,這個屬性會比較慢毁嗦。
WPF開始設(shè)計的時候亲茅,就考慮到了多線程的問題。大部分的WPF類都繼承于DispatcherObject狗准。DispatcherObject實際就是對Dispatcher的一個簡單封裝克锣。Dispatcher提供了類似InvokeRequired的方法(CheckAccess)。這個方法只是比較線程的ID腔长,所以會很快袭祟。另外,Dispatcher提供了優(yōu)先隊列捞附,異步調(diào)用巾乳,Timer等功能,簡化了開發(fā)多線程GUI程序鸟召。
控件的Composition
在WinForm如果要實現(xiàn)一個有Checkbox的下拉菜單胆绊,將不得不處理復(fù)雜的Window消息。而通過WPF控件的Content Model和Layout系統(tǒng)欧募,WPF控件可以包括任何類型的控件压状,甚至.Net CLR對象。很多現(xiàn)代的控件廠商也提供了Composition的控件,實現(xiàn)方法和WPF的Content模型也比較相似种冬。WPF開發(fā)團隊?wèi)?yīng)該借鑒了Infragistics的很多想法镣丑。有了這個基礎(chǔ),開發(fā)新的WPF控件更加簡單了娱两。
XAML
個人覺得XAML應(yīng)該是WPF中比較劃時代的東東莺匠。通過XAML,我們可以用文本的方式描述復(fù)雜的Object Graph十兢。這個想法在VB中就有了趣竣,不過XAML更簡化,以便于使用工具來生成XAML纪挎。通過Command期贫,Routing Event等機制,界面設(shè)計人員和程序員有比較清楚的界限异袄。
Dependency Property
在WinForm開發(fā)中,經(jīng)常碰到的問題就是一個控件的值變了玛臂,其他控件也會跟著改變烤蜕。解決辦法,要不是通過寫代碼迹冤,要不是通過數(shù)據(jù)綁定讽营,前者是界面和代碼沒法分開,后者還不夠靈活泡徙。而WPF在這方面通過XAML可以簡單的把相關(guān)的屬性聯(lián)系起來橱鹏,通過Extension可以實現(xiàn)復(fù)雜的綁定關(guān)系。
總的來說堪藐,我覺得WPF應(yīng)該是GUI發(fā)展的一個延續(xù)莉兰,原來GUI中復(fù)雜的東西,現(xiàn)在通過簡單的文本就可以實現(xiàn)礁竞。