WPF可以認(rèn)為是MS利用原有.NET框架的一些特色,加上DirextX的產(chǎn)物。將原有的編程模型統(tǒng)一化. 我們來看看WPF的運(yùn)行機(jī)制.
那么我們現(xiàn)在來分析一下WPF的運(yùn)行過程吧。
首先從第一個(gè)方塊說起:WPF的進(jìn)程會加載四個(gè)程序集,Kernel,User32,DirectX,milcore.他們對原有的CLR進(jìn)行了擴(kuò)展。我們看看他們分別起什么作用。Kernel,它負(fù)責(zé)控制和管理與圖形驅(qū)動相關(guān)的最底層任務(wù)等。在Kernel之后也是兩個(gè)比較底層的模塊。其中,User32負(fù)責(zé)確定顯示窗口及其在屏幕中的位置狀態(tài)等,其并不參與常見控件的呈現(xiàn)。DirectX負(fù)責(zé)呈現(xiàn)窗口和內(nèi)容等。milcore是WPF的核心部分,它主要起到中間人的作用,以實(shí)現(xiàn)WPF與DirectX的通信(非受管模塊)。
第二個(gè)方塊:由CLR來加載WPF的另三個(gè)程序集WindowsBase,PresentationFramework和PresentationCore,它們都是受管模塊。我們下邊要講解的WPF主要類型,基本都來自于這三個(gè)dll。
WindowsBase是WPF API基礎(chǔ)架構(gòu)的核心類型。 PresentationCore主要包括WPF的一些基本類型,例如UIElement,Visual等。它們是PresentationFramework所包括元素的基類。 PresentationFramework主要定義WPF的窗口、面板、樣式等高層WPF類型。
第三個(gè)方塊:編譯好機(jī)器碼以后,就可以執(zhí)行指令了,這里會創(chuàng)建Systemdomain,它包含了SharedDomain和默認(rèn)的應(yīng)用程序域,也就是當(dāng)前應(yīng)用程序自己的域,前面我們說過一個(gè).net進(jìn)程中可以包含多個(gè)默認(rèn)的應(yīng)用程序域,而這些應(yīng)用程序域都會用到mscorlib.dll,如果每個(gè)默認(rèn)的應(yīng)用程序域中都去加載它,那么無疑會造成內(nèi)存的浪費(fèi),所以就有了SharedDomain,它是用來放所有Domain都要用到的Dll,這樣就避免了浪費(fèi)內(nèi)存.也優(yōu)化了加載的速度.
第四個(gè)方塊:這時(shí)候默認(rèn)的應(yīng)用程序域,就會去找到WPF項(xiàng)目中的Main方法.
OK明白了WPF的啟動過程,我們來看看WPF程序中要用到的主要類的層次關(guān)系:
DispatcherObject: WPF中有許多類繼承自DispatcherObject,DispatcherObject提供了處理同步和并發(fā)的基本構(gòu)造。WPF建立在dispatcher提供的消息系統(tǒng)之上。WPF的dispatcher使用User32消息來實(shí)現(xiàn)線程間調(diào)用。
WPF中的控件,圖形操作,動畫多媒體,以及3D效果就是由下面4個(gè)類的派生類來完成的:
2Shape:WPF 中呈現(xiàn)二維矢量圖形的基礎(chǔ)類。有 Line、Polyline、Polygon、Path、Rectangle 和 Ellipse等子類??蓮?Shape 類進(jìn)行派生以實(shí)現(xiàn)自定義矢量圖形基元。從 Shape 派生是確保這些自定義基元使用 WPF 布局系統(tǒng)的協(xié)議的最簡單方法。
3Freezable:WPF中對動畫和多媒體的操作類,基本上都是派生自它,它實(shí)現(xiàn)了多種生成深層克隆的方法。
4Visual3D:提供可視三維對象通用的服務(wù)和屬性,其中包括命中測試、坐標(biāo)轉(zhuǎn)換和邊界框計(jì)算。與Visual類一樣,只不過是3D的基礎(chǔ)類. |
|