目錄
什么是WPF叭爱?
WPF的歷史?
為什么要用WPF及WPF作用
WPF與winForm區(qū)別?
什么是WPF蓖捶?
Windows APIWindows Presentation Foundation (WPF):Windows 客戶端應(yīng)用程序除师,微軟推出的基于Windows 的用戶界面框架沛膳。
WPF是應(yīng)用程序一個嶄新的概念:數(shù)據(jù)驅(qū)動程序,以數(shù)據(jù)為中心汛聚,通過Bind將界面永遠(yuǎn)定位為從屬地位锹安。
說白了就是一個把數(shù)據(jù)呈現(xiàn)給用戶的UI界面。
WPF不是一個簡單的UI界面顯示 倚舀,它的功能包括可擴(kuò)展應(yīng)用程序標(biāo)記語言 (XAML)叹哭、控件、數(shù)據(jù)綁定痕貌、布局风罩、二維和三維圖形、動畫舵稠、樣式超升、模板、文檔哺徊、媒體室琢、文本和版式。
WPF是基于DirectX引擎的落追,支持GPU硬件加速盈滴,不支持硬件加速時也可以使用軟件繪制。高級別的線程進(jìn)行繪制轿钠,提高使用者的體驗巢钓。自動識別顯示器分辨率并進(jìn)行縮放,比如Vista谣膳。
WPF技術(shù)發(fā)展歷史
微軟1983春宣布研究Windows竿报,微軟官方主力推行的編程語言與API有四個主要階 段:
1983~1991年:C搭配Windows API。當(dāng)時程序員少继谚,開發(fā)一個項目比較困難烈菌。
1992~2001年:C++搭配MFC庫。MFC是最多人用的Windows編程方法。慢慢的MFC技術(shù)逐漸退出了歷史的舞臺芽世。
2002~2006年:(C#挚赊、VB以及其他語言)+Windows Form框架。這段期間IT技術(shù)的焦點(diǎn)是在Web上济瓢,主角是ASP.NET荠割,而不是Windows Forms。這時WPF就出現(xiàn)旺矾。Windows Forms其實是不錯的技術(shù)蔑鹦,但沒有引起大家重視,更偏向于用Delphi和MFC箕宙,造成Windows Forms生不逢時嚎朽。
2007~現(xiàn)在 :2007年1月30日,Windows Vista正式全球同步發(fā)布柬帕。它之所以能實現(xiàn)那么絢麗的效果哟忍,最關(guān)鍵的一點(diǎn)就是Windows Presentation Foundation(WPF),WPF所帶來的震撼視覺效果和用戶體驗使Vista的效果如此絢麗陷寝,為 Windows 7打下了堅實的繼承锅很。后臺語言(C#、VB以及其他語言)+XAML構(gòu)成的WPF凤跑。WPF支持硬件加速爆安、精確顏色、浮點(diǎn)坐標(biāo)饶火、動畫實現(xiàn)鹏控、三維、視頻感受等要求提高肤寝。而傳統(tǒng) Winform 是到不到這些效果的当辐。
為什么要用WPF及WPF作用
每次的技術(shù)前進(jìn)都會讓我們提高工作的效率,WPF為我們減少了很多的代碼鲤看,而且實現(xiàn)了邏輯與界面很好的分離缘揪。
WPF,你可以創(chuàng)建豐富义桂、美妙的連接應(yīng)用程序找筝,以充分利用 Windows 平臺,其中包括 UI慷吊、媒體袖裕、脫機(jī)通信和文檔支持
WPF核心組件
WPF 中的所有顯示是通過 DirectX 引擎完成的,可實現(xiàn)高效的硬件和軟件呈現(xiàn)溉瓶。
WPF 對內(nèi)存和執(zhí)行進(jìn)行精確控制急鳄。
milcore組件谤民,它的職責(zé)是完成與Direct3D的交互,出于效率和安全考 慮疾宏,milcore由非托管代碼實現(xiàn)张足。
milcore 中的組合引擎受性能影響關(guān)系大,需要放棄 CLR 的許多優(yōu)點(diǎn)來提高性能坎藐。
WPF的兩大核心組件PresentationFramework和PresentationCore都位于通用語言運(yùn)行庫(CLR)之上为牍。WPF的大部分代碼都是以托管形式存在的。這兩大組件提供了WPF項目需要的函數(shù)庫和功能庫岩馍,由于是以托管的形式存在碉咆,所以也避免了我們直接操 作底層和出現(xiàn)諸如內(nèi)存泄露的可能性。
WPF基本功能和服務(wù)
五大塊:
Core Presentation:包含了所有的圖形效果兼雄,如圖形吟逝、2D圖形、3D圖形赦肋、文本、音頻励稳、視頻和顯示效果佃乘。包 括強(qiáng)大的動畫效果,動畫可以應(yīng)用前面的所有元素驹尼。最下面的那個就是視覺基本元素趣避。
User Interface Services:包含了Application Services(應(yīng)用程序服務(wù))、Deployment Services(部署服務(wù))新翎、Controls(控件庫)程帕、Layout(布局)和Data Binding(數(shù)據(jù)綁定).
Base Services:提供了XAML支持、Accessibility(提高開發(fā)效率)地啰、 Input&Events(輸入和事件的支持)愁拭、PropertySystem(屬性系統(tǒng))。
Document Servies :基本的打印亏吝,實現(xiàn)自定義的打印
XPS Viewer:表報服務(wù)岭埠,可以通過這些組件顯示 效果。
基本特性及使用情況
在輸入方面:WPF支持鍵盤蔚鸥、鼠標(biāo)惜论、手寫筆、觸摸屏止喷,藍(lán)牙錄入馆类、視頻撲捉等,所以基本沒有任何限制
外部設(shè)備的交互:有驅(qū)動弹谁、COM乾巧、Win32或 通信協(xié)議支持的任何設(shè)備
打印和報表方面:可訪問打印對話框技羔、打印隊列、打印窗體卧抗、控件以及很多可選操作藤滥,對報表也有很好的支持。
支持流文檔和固定 文檔社裆,對命令的支持以及對文件的無限制訪問拙绊,尤其在動畫、圖形圖像泳秀、3D标沪、影像的支持相當(dāng)好。
WPF除了在性能方面存在 著缺陷以外嗜傅,其他方面可以說是做得非常優(yōu)秀金句。
相似的技術(shù)
WPF:使用XAML定義程序界面(如前所述,可以手工編寫吕嘀,可以采用 Experssion Blend等可視化工具編寫)违寞,再用.NET語言(C#, VB.Net等)編寫相應(yīng)的邏輯代碼。
邏輯代碼既可以直接嵌入XAML文件中偶房,也可保存為獨(dú)立的代碼文件
桌面應(yīng)用程序和Web應(yīng)用程序
一套編碼趁曼,桌面應(yīng)用程序與Web應(yīng)用程序均可運(yùn)用。
WPF不僅使美化棕洋、多樣化了桌面應(yīng)用程序挡闰,也是使Web變得異彩紛呈。WPF使3D進(jìn) 入Web成為可能掰盘。比如摄悯,你可以使用矢量圖形設(shè)計軟件(Illustrator, CorelDraw等, 微軟也有了!叫“Expression Designer”)設(shè)計好圖片愧捕,然后將圖形輸出或?qū)С龀蔀閄AML格式奢驯。然后,你可以在Blend中打開XAML文件晃财,制作成動畫叨橱,最后生成的也是 XAML。通過.Net語言(如C#)進(jìn)行編程断盛,還可以控制這些XAML罗洗。
WPF與WinForm、silverlight區(qū)別
WPF技術(shù)比WinForm技術(shù)更先進(jìn)钢猛,來取代WinForm技術(shù)的伙菜。
silverlight是簡版的WPF,silverlight只可用于給WEB應(yīng)用程序添加動態(tài)內(nèi)容命迈。WPF則可以編寫在跨越WEB和桌面的應(yīng)用程序
Windows Forms在底層使用的是GDI+贩绕。GDI+是GDI的“面向?qū)ο蟀b”火的,C++實現(xiàn)。Windows Forms應(yīng)用程序的GDI+淑倾,在C++實現(xiàn)的非托管代碼之上又包了一層馏鹤,從而讓我們能使用C#這樣的托管編程語言調(diào)用GDI+功能繪圖。
WPF底層使用的是DirectX娇哆,就是通常用來開發(fā)游戲的那個DirectX湃累。
Silverlight在API層可以看成是WPF的子集,除了這點(diǎn)之外碍讨,Silverlight與WPF無任何聯(lián)系治力。Silverlight應(yīng)用程序不依賴于.NET Framework,用戶計算機(jī)勃黍、手機(jī)安裝有Silverlight運(yùn)行環(huán)境(比如瀏覽器添加了Silverlight插件)宵统,即可運(yùn)行Silverlight應(yīng)用程序。Silverlight運(yùn)行時環(huán)境在API層面也可以看成是標(biāo)準(zhǔn).NET Framework的功能子集覆获,但它是重新寫過的马澈,獨(dú)立于標(biāo)準(zhǔn)的.NET Framework。
Windows Forms/WPF/Silverlight這三者是獨(dú)立發(fā)展的三個技術(shù)領(lǐng)域锻梳。微軟出于方便開發(fā)的目的箭券,有意讓Silverlight與WPF在應(yīng)用層面開發(fā)體驗(甚至包括大部分應(yīng)用層代碼)高度一致。
開發(fā)角度
Windows Forms成熟疑枯,擁有大量的第三方控件等資源,如果開發(fā)“標(biāo)準(zhǔn)”與“通用”界面類型的Windows應(yīng)用程序蛔六,使用它可以獲得較高的開發(fā)效率和不錯的運(yùn)行性能荆永。
WPF的開發(fā)非常“個性化”的Windows應(yīng)用程序国章,實現(xiàn)你所能“夢想”到的各種用戶界面具钥,且在動畫等多媒體方面,WPF優(yōu)于Windows Forms液兽。WPF的數(shù)據(jù)綁定機(jī)制也比Windows Forms要強(qiáng)大和靈活骂删。
Windows Forms和WPF主要用于開發(fā)桌面應(yīng)用程序,Silverlight主要戰(zhàn)場是互聯(lián)網(wǎng)四啰,通常用它來開發(fā)RIA的互聯(lián)網(wǎng)應(yīng)用程序宁玫,或者手機(jī)等智能移動設(shè)備上的應(yīng)用程序。
會WPF柑晒,不費(fèi)太多力氣欧瘪,就可以轉(zhuǎn)去開發(fā)Silverlight應(yīng)用程序,兩者相似匙赞,特別是界面層代碼佛掖,由于都使用XAML妖碉,這使我們可以比較容易地為某一應(yīng)用程序同時開發(fā)“桌面版”、“手機(jī)版”和“瀏覽器版”三種版本芥被,而這三種版本其用戶界面都可以擁有一致的外觀和用戶使用體驗欧宜。
比較
WPF對計算機(jī)硬件的要求較高,對于硬件配置較低的計算機(jī)拴魄,其運(yùn)行性能不如Windows Forms版本冗茸,對內(nèi)存也是有要求的。隨著計算機(jī)硬件的性能提高羹铅,差距會越來越小蚀狰。
界面的執(zhí)行效率:WinForm優(yōu)于WPF
開發(fā)效率: WPF優(yōu)于WinForm,WPF實現(xiàn) UI與邏輯分離职员,適合團(tuán)隊開發(fā)麻蹋,而且在維護(hù)成本低。
開發(fā)成本焊切,WPF高于WinForm
美觀度:WPF優(yōu)于WinForm
范圍應(yīng)用:WPF優(yōu)于WinForm
WPF比WinForm的較好的特性
什么是Window Handle扮授?(句柄)
答:Handle是Windows操作系統(tǒng)中的一個概念。在Windows程序中专肪,有各種各樣的資源(窗口刹勃、圖標(biāo)、光標(biāo)等)且資源都有標(biāo)示號嚎尤,創(chuàng)建這些資源時系統(tǒng)會為它們分配內(nèi)存荔仁,返回資源的標(biāo)示號,即句柄芽死。句柄指的是一個核心對象在某一個進(jìn)程中的唯一索引乏梁,而不是指針。句柄是和對象一一對應(yīng)的32位無符號整數(shù)值
一关贵、解決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解決方式
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對象。有了這個基礎(chǔ)少办,開發(fā)新的WPF控件更加簡單了。
四诵原、XAML
通過XAML英妓,可以用文本的方式描述復(fù)雜的Object Graph。通過Command绍赛,Routing Event等機(jī)制蔓纠,界面設(shè)計人員和程序員清楚的進(jìn)行了界限。
五吗蚌、Dependency Property
在WinForm開發(fā)中腿倚,一個控件的值變了,其他控件也會跟著改變蚯妇。解決辦法是通過寫代碼或通過數(shù)據(jù)綁定敷燎,通過寫代碼是界面和代碼沒法分開暂筝,后者還不夠靈活。
WPF在這方面通過XAML可以簡單的把相關(guān)的屬性聯(lián)系起來硬贯,通過Extension可以實現(xiàn)復(fù)雜的綁定關(guān)系焕襟。
總結(jié)
不管是WinForm還是WPF都是可以進(jìn)行很好的桌面程序的開發(fā),各自有自己的特點(diǎn)饭豹。
如果你對UI要求不是很高鸵赖,想追求性能好一點(diǎn)那就用WinForm
如果想做的非常美,那就用WPF拄衰,而且WPF也可進(jìn)行Web開發(fā)它褪。如果有WPF網(wǎng)頁開發(fā)需求,可以嘗試轉(zhuǎn)換平臺到Silverlight