原創(chuàng)|其它|編輯:郝浩|2009-04-27 09:39:58.000|閱讀 606 次
概述:WPF基礎(chǔ)之體系結(jié)構(gòu)
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
System.Windows.Media.Visual
定義一個(gè)系統(tǒng)后,下一步是將像素繪制到屏幕上。Visual 類(lèi)用于生成可視化對(duì)象的樹(shù),每個(gè)對(duì)象可以選擇性地包含繪制指令以及有關(guān)如何呈現(xiàn)這些指令(剪輯、變換等)的元數(shù)據(jù)。Visual 設(shè)計(jì)為極其輕量且靈活,所以大部分功能未進(jìn)行 API 公開(kāi),并且極為依賴(lài)受保護(hù)的回調(diào)函數(shù)。
Visual 實(shí)際上是到 WPF 組合系統(tǒng)的入口點(diǎn)。Visual 是以下兩個(gè)子系統(tǒng)之間的連接點(diǎn):托管 API 和非托管 milcore。
WPF 通過(guò)遍歷由 milcore 管理的非托管數(shù)據(jù)結(jié)構(gòu)來(lái)顯示數(shù)據(jù)。這些結(jié)構(gòu)(稱(chēng)為組合節(jié)點(diǎn))代表層次結(jié)構(gòu)顯示樹(shù),其中每個(gè)節(jié)點(diǎn)都有呈現(xiàn)指令。只能通過(guò)消息傳遞協(xié)議來(lái)訪問(wèn)此樹(shù)(下圖右側(cè)所示)。
當(dāng)對(duì) WPF 編程時(shí),您將創(chuàng)建 Visual 元素及派生的類(lèi)型,它們通過(guò)此消息傳遞協(xié)議在內(nèi)部與此組合樹(shù)進(jìn)行通信。WPF 中的每個(gè) Visual 可以不創(chuàng)建組合節(jié)點(diǎn),也可以創(chuàng)建一個(gè)或多個(gè)組合節(jié)點(diǎn)。
請(qǐng)注意一個(gè)非常重要的體系結(jié)構(gòu)細(xì)節(jié) – 可視對(duì)象和繪制指令的整個(gè)樹(shù)都要進(jìn)行緩存。在圖形方面,WPF 使用一個(gè)保留的呈現(xiàn)系統(tǒng)。這可以使系統(tǒng)以一個(gè)高刷新率重繪系統(tǒng),并且不會(huì)發(fā)生組合系統(tǒng)阻止對(duì)用戶(hù)代碼的回調(diào)。這有助于防止出現(xiàn)應(yīng)用程序無(wú)響應(yīng)的情況。
關(guān)系圖中不十分引人注意的另一個(gè)重要細(xì)節(jié)是系統(tǒng)實(shí)際上如何執(zhí)行組合。
在 User32 和 GDI 中,系統(tǒng)是在一個(gè)即時(shí)模式剪輯系統(tǒng)上工作。當(dāng)需要呈現(xiàn)一個(gè)組件時(shí),系統(tǒng)會(huì)建立一個(gè)剪輯邊界,不允許組件接觸該邊界之外的像素,然后會(huì)要求此組件在該框中繪 制像素。此系統(tǒng)在內(nèi)存受限的系統(tǒng)上工作良好,因?yàn)楫?dāng)某些內(nèi)容更改時(shí),只需要處理受影響的組件即可 – 不會(huì)有兩個(gè)組件對(duì)一個(gè)像素的顏色更改起作用。
WPF 使用“繪畫(huà)器的算法”繪制模型。這意味著并不是剪輯每個(gè)組件,而是要求從顯示內(nèi)容的背面至正面來(lái)呈現(xiàn)每個(gè)組件。這允許每個(gè)組件在先前的組件的顯示內(nèi)容上繪 制。此模型的優(yōu)點(diǎn)是您可以生成部分透明的復(fù)雜形狀。與現(xiàn)今的現(xiàn)代圖形硬件比較,此模型相對(duì)要快(創(chuàng)建 User32/ GDI 的情況除外)。
如上面所述,WPF 的一個(gè)核心原理是移動(dòng)到一個(gè)更具聲明性且“以屬性為核心”的編程模型。在可視化系統(tǒng)中,這會(huì)表現(xiàn)為需要關(guān)注的兩種情況。
首先,如果您考慮保留的模式圖形系統(tǒng),則實(shí)際上是從命令性 DrawLine/DrawLine 類(lèi)型模型移動(dòng)到面向數(shù)據(jù)的模型 new Line()/new Line()。通過(guò)這一向數(shù)據(jù)驅(qū)動(dòng)的呈現(xiàn)移動(dòng),可以在使用屬性表達(dá)的繪制指令上進(jìn)行復(fù)雜的操作。從 Drawing 派生的類(lèi)型實(shí)際上是用于呈現(xiàn)的對(duì)象模型。
第二,如果評(píng)估動(dòng)畫(huà)系統(tǒng),您將看到它幾乎是完全聲明性的。無(wú)需要求開(kāi)發(fā)人員計(jì)算下一位置或下一顏色,您可以將動(dòng)畫(huà)表示為動(dòng)畫(huà)對(duì)象上的一組屬性。于 是,這些動(dòng)畫(huà)可以表示開(kāi)發(fā)人員或設(shè)計(jì)人員的意圖(在 5 秒內(nèi)將此按鈕從一個(gè)位置移動(dòng)到另一個(gè)位置),系統(tǒng)就可以確定完成此任務(wù)的最有效方式。
System.Windows.UIElement
UIElement 定義核心子系統(tǒng),包括 Layout、Input 和 Event。
Layout 是 WPF 中的一個(gè)核心概念。在許多系統(tǒng)中,可能有一組固定的布局模型(HTML 支持三種布局模型:流、絕對(duì)和表),也可能沒(méi)有布局模型(User32 實(shí)際僅支持絕對(duì)定位)。WPF 先假設(shè)開(kāi)發(fā)人員和設(shè)計(jì)人員希望有一個(gè)靈活的可擴(kuò)展布局模型,該模型可能是由屬性值而不是命令性邏輯驅(qū)動(dòng)的。在 UIElement 級(jí)別,會(huì)引入布局的基本協(xié)定 - 具有 Measure 和 Arrange 處理過(guò)程的兩階段模型。
Measure 允許組件確定它要采用的大小。此階段獨(dú)立于 Arrange,因?yàn)樵谠S多情形下,父元素會(huì)要求子元素測(cè)量若干次以確定其最佳位置和大小。父元素要求子元素測(cè)量這一事實(shí)體現(xiàn)了 WPF 的另一關(guān)鍵原則 – 內(nèi)容大小。WPF 中的所有控件支持調(diào)整到內(nèi)容原始大小的功能。這使本地化更加容易,并允許在調(diào)整大小時(shí)對(duì)元素進(jìn)行動(dòng)態(tài)布局。Arrange 階段允許父元素定位并確定每個(gè)子元素的最終大小。
通常會(huì)花費(fèi)大量的時(shí)間來(lái)討論 WPF 的輸出端(Visual 及其相關(guān)對(duì)象)。然而,在輸入端也有許多創(chuàng)新。WPF 輸入模型的最基本更改也許是一致模型,輸入事件通過(guò)系統(tǒng)借助此模型進(jìn)行路由。
輸入是作為內(nèi)核模式設(shè)備驅(qū)動(dòng)程序上的信號(hào)發(fā)出的,并通過(guò)涉及 Windows 內(nèi)核和 User32 的復(fù)雜進(jìn)程路由到正確的進(jìn)程和線(xiàn)程。與輸入相對(duì)應(yīng)的 User32 消息一旦路由到 WPF,它就會(huì)轉(zhuǎn)換為 WPF 原始輸入消息,并發(fā)送到調(diào)度程序。WPF 允許原始輸入事件轉(zhuǎn)換為多個(gè)實(shí)際事件,允許在保證傳遞到位的情況下在較低的系統(tǒng)級(jí)別實(shí)現(xiàn)類(lèi)似“MouseEnter”的功能。
每個(gè)輸入事件至少會(huì)轉(zhuǎn)換為兩個(gè)事件 – “預(yù)覽”事件和實(shí)際事件。WPF 中的所有事件都具有通過(guò)元素樹(shù)路由的概念。如果事件從目標(biāo)向上遍歷樹(shù)直到根,則被稱(chēng)為“冒泡”,如果從根開(kāi)始向下遍歷到目標(biāo),它們被稱(chēng)為“隧道”。輸入預(yù) 覽事件隧道,使樹(shù)中的任何元素都有機(jī)會(huì)篩選事件或?qū)κ录扇〔僮鳌H缓螅R?guī)(非預(yù)覽)事件將從目標(biāo)向上冒泡到根。
分割隧道和冒泡階段使快捷鍵等功能在復(fù)合世界中表現(xiàn)一致。在 User32 中,您可以通過(guò)使用一個(gè)全局表來(lái)實(shí)現(xiàn)快捷鍵,該表中包含您希望支持的所有快捷鍵(Ctrl+N 映射為“新建”)。在應(yīng)用程序的調(diào)度程序中,您可以調(diào)用 TranslateAccelerator,它會(huì)探查 User32 中的輸入消息,并確定是否有任何消息與已注冊(cè)的快捷鍵匹配。在 WPF 中,上述內(nèi)容不會(huì)起作用,因?yàn)橄到y(tǒng)是完全“可組合”的 – 任何元素都可以處理和使用任何快捷鍵。將這個(gè)兩階段模型用于輸入,將允許組件實(shí)現(xiàn)其自己的TranslateAccelerator"。
為了進(jìn)一步深化此功能,UIElement 還引入了 CommandBindings 的概念。WPF 命令系統(tǒng)允許開(kāi)發(fā)人員以命令終結(jié)點(diǎn)(一種用于實(shí)現(xiàn) ICommand 的功能)的方式定義功能。命令綁定使元素可以定義輸入筆勢(shì) (Ctrl+N) 和命令(“新建”)之間的映射。輸入筆勢(shì)和命令定義都是可擴(kuò)展的,并且可以在使用時(shí)聯(lián)系到一起。這使得一些操作(例如,允許最終用戶(hù)自定義其要在應(yīng)用程序 內(nèi)使用的鍵綁定)顯得無(wú)關(guān)緊要。
至此,本主題已重點(diǎn)討論了 WPF 的“核心”功能 - PresentationCore 程序集中實(shí)現(xiàn)的功能。當(dāng)生成 WPF 時(shí),基礎(chǔ)部分(例如帶有 Measure 和 Arrange 的布局的協(xié)定)和框架部分(例如 Grid 的特定布局的實(shí)現(xiàn))之間的明確劃分是希望的結(jié)果。目標(biāo)就是提供在堆棧中處于較低位置的可擴(kuò)展性點(diǎn),這將允許外部開(kāi)發(fā)人員可以在需要時(shí)創(chuàng)建自己的框架。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:自互聯(lián)網(wǎng)