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