了解WPF框架
首當(dāng)其沖的,自然是System.Object類了。這里主要想說的是,WPF的大部分代碼都是使用托管代碼編寫,原因是因?yàn)镃LR的許多不錯(cuò)的特性(如內(nèi)存管理、錯(cuò)誤處理、通用類型系統(tǒng)等。),可以讓開發(fā)的程序更有效、更健壯。但是,框架并不是所有代碼都是托管的,也有一部分是由非托管代碼編寫。原因主要是因?yàn)閃PF是展現(xiàn)層框架,它的顯示需要和DirectX很緊密的集成起來,進(jìn)行硬渲染和軟渲染,以得到性能上的提升。
??? 下面的結(jié)構(gòu)圖中,紅色部分是屬于WPF框架的。其中,只有milcore這個(gè)部分是采用非托管代碼編寫。所以,可以看出,我們在使用WPF的時(shí)候,是不會接觸到里面的非托管代碼的。
DispatcherObject(異步)
??? 命令空間:System.Threading。 ??? WPF Dispatcher使用User32的消息機(jī)制來實(shí)現(xiàn)跨線程調(diào)用。工作機(jī)制類似Win32的消息泵。 ??? WPF的線程模型和User32的線程模型保持一致,使用STA。主要原因是互可操作性,因?yàn)楝F(xiàn)在的很多系統(tǒng)都是需要STA的,如IE、OLE2.0、剪貼板等。 ??? 通過Dispatcher,我們可以實(shí)現(xiàn)線程間的通信。繼承自DispatcherObejct的類,都獲取了一個(gè)所在線程的Dispatcher引用,這樣,任何使用這個(gè)類的對象的線程,都可以使用它的Dispatcher來發(fā)送“消息”。 一般情況下,我們使用這個(gè)類的意圖主要是異步線程調(diào)用DispatcherObject的Dispather來讓DispatcherObject的創(chuàng)建線程做一些特定的事情,如設(shè)置界面上某個(gè)值。這樣大大方便了我們開發(fā)人員。想想我原來用WindowsForm開發(fā)的時(shí)候,為了異步調(diào)用顯示一下Label,寫出來的代碼真是夠繁瑣。
DependencyObject(屬性)
??? 命令空間:System.Windows。 ???? WPF框架中最主要的思想之一是:優(yōu)先使用屬性,而不是事件、方法。 ??? 繼承自DependencyObject的類,就擁有了WPF特別定制的“富”屬性系統(tǒng)。該屬性系統(tǒng)提供了以下好處: ??? 1. Dependency Property:“依賴”的屬性,自動(dòng)檢測依賴性的屬性表達(dá)式,當(dāng)被依賴的屬性變化時(shí),自動(dòng)更新屬性值。 ??? 2. 使用盡量少的屬性值存儲空間。因?yàn)椴⒉皇敲恳粋€(gè)屬性都會存儲在內(nèi)存中。 ??? 3. Attached Property:任何一個(gè)類都允許使用其它的類定義的任何依賴屬性。(類似于javascript的expando特性。)
Visual(集成、繪制)
??? 命令空間:System.Windows.Media。 ??? Visual類才真正是WPF的入口點(diǎn)。就是在這里,整合了托管代碼API和非托管代碼milcore。 ??? WPF使用milcore中的一種叫Composition Nodes的數(shù)據(jù)結(jié)構(gòu)來進(jìn)行顯示。這種數(shù)據(jù)結(jié)構(gòu)類似一棵樹,樹的每個(gè)節(jié)點(diǎn)都帶有繪制的指令。Visual以及Visual的子類,可以通過消息協(xié)議來和Composition Nodes進(jìn)行通信。(每一個(gè)Visual,可能會建立零到多個(gè)不等的Composition Nodes。)重點(diǎn)是:Visual的整棵樹及其所附屬繪制指令,都會被緩存起來。這樣,整個(gè)系統(tǒng)可以進(jìn)行高速的重繪,也不會因?yàn)橛脩舫绦虻淖枞枞@示。 ??? 在User32和GDI中,系統(tǒng)是通過一種盒子方式來進(jìn)行繪制的:每一個(gè)成員都被放在一個(gè)指定的區(qū)域里面進(jìn)行繪制,然后再疊加再一起。這樣生成的圖象中的每一個(gè)象素,其實(shí)都只屬于唯一一個(gè)成員。但是是WPF系統(tǒng)中,使用的是"painter’s algorithm"繪制算法:從后到前,一個(gè)一個(gè)的畫出這些成員。這樣的話,后畫出來的成員就在已經(jīng)繪制好的圖案上繼續(xù)進(jìn)行繪制,就可以顯示出一些復(fù)雜的半透明的圖形。 ??? 而“屬性優(yōu)先”的思想,在Visual類中也有所體現(xiàn)。如,我們原來熟悉的DrawLine()/DrawLine()方式,現(xiàn)在變成了new Line()/new Line()。這種數(shù)據(jù)驅(qū)動(dòng)的編程方式,可以讓我們使用屬性來完成一些復(fù)雜的繪制操作。又如,動(dòng)畫的使用方式,也是完全的使用屬性聲明方式。
UIElement(界面基礎(chǔ))
??? 命令空間:System.Windows。
??? UIElement提供了很多PresentationCore程序集中比較重要的特性:
總結(jié)
- 上一篇: vbs整人代码蓝屏_vbs整人代码
- 下一篇: 一个基于.NET Core3.1的开源项