原創|其它|編輯:郝浩|2009-04-27 09:35:26.000|閱讀 639 次
概述:本主題提供 Windows Presentation Foundation (WPF) 類層次結構的指導教程,涵蓋了 WPF 的大部分主要子系統,并描述它們是如何交互的。本主題還詳細介紹了 WPF 架構師所做的一些選擇。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
本主題提供 Windows Presentation Foundation (WPF) 類層次結構的指導教程,涵蓋了 WPF 的大部分主要子系統,并描述它們是如何交互的。本主題還詳細介紹了 WPF 架構師所做的一些選擇。
System.Object
WPF 主要編程模型是通過托管代碼公開的。在 WPF 的早期設計階段,曾有過大量關于如何界定系統的托管組件和非托管組件的爭論。CLR 提供一系列的功能,可以令開發效率更高并且更加可靠(包括內存管理、錯誤處理和通用類型系統等),但這是需要付出代價的。
下圖說明了 WPF 的主要組件。關系圖的紅色部分(PresentationFramework、PresentationCore 和 milcore)是 WPF 的主要代碼部分。在這些組件中,只有一個是非托管組件 – milcore。milcore 是以非托管代碼編寫的,目的是實現與 DirectX 的緊密集成。WPF 中的所有顯示是通過 DirectX 引擎完成的,可實現高效的硬件和軟件呈現。WPF 還要求對內存和執行進行精確控制。milcore 中的組合引擎受性能影響關系大,需要放棄 CLR 的許多優點來提高性能。
本主題的后面部分將討論 WPF 的托管和非托管部分之間的通信。下面介紹托管編程模型的其余部分。
System.Threading.DispatcherObject
WPF 中的大多數對象是從 DispatcherObject 派生的,這提供了用于處理并發和線程的基本構造。WPF 基于調度程序實現的消息系統。其工作方式與常見的 Win32 消息泵非常類似;事實上,WPF 調度程序使用 User32 消息執行跨線程調用。
要討論 WPF 中的并發,首先必須真正理解兩個核心概念 – 調度程序和線程關聯。
在 WPF 的設計階段,目標趨向于單一線程的執行,但這不是一種與線程“關聯的”模型。當一個組件使用執行線程的標識來存儲某種類型的狀態時,將發生線程關聯。最常 見的形式是使用線程本地存儲 (TLS) 來存儲狀態。線程關聯要求執行的每個邏輯線程僅由操作系統中的一個物理線程所擁有,這將占用大量內存。最后,WPF 的線程處理模型保持與具有線程關聯的單一線程執行的現有 User32 線程處理模型同步。主要原因是互操作性 – 類似于 OLE 2.0 的系統、剪貼板和 Internet Explorer 均需要單一線程關聯 (STA) 執行。
假設您具有帶有 STA 線程的對象,則需要一種方式來在線程之間通信,并驗證您是否位于正確的線程上。調度程序的作用就在于此。調度程序是一個基本的消息調度系統,具有多個按優 先級排列的隊列。消息的示例包括原始輸入通知(鼠標移動)、框架函數(布局)或用戶命令(執行此方法)。通過從 DispatcherObject 派生,您可以創建一個具有 STA 行為的 CLR 對象,并在創建時獲得一個指向調度程序的指針。
System.Windows.DependencyObject
生成 WPF 時使用的主要體系結構原理之一是首選屬性而不是方法或事件。屬性是聲明性的,使您更方便地指定意圖而不是操作。它還支持模型驅動或數據驅動的系統,以顯示用戶界面內容。這種理念的預期效果是創建您可以綁定到的更多屬性,從而更好地控制應用程序的行為。
為了從由屬性驅動的系統獲得更多,需要一個比 CLR 提供的內容更豐富的屬性系統。此豐富性的一個簡單示例就是更改通知。為了實現雙向綁定,您需要綁定的雙方支持更改通知。為了使行為與屬性值相關聯,您需要 在屬性值更改時得到通知。Microsoft .NET Framework 具有一個 INotifyPropertyChange 接口,使對象可以發布更改通知(不過,這是可選的)。
WPF 提供一個豐富的屬性系統,該屬性系統是從 DependencyObject 類型派生的。該屬性系統實際是一個“依賴”屬性系統,因為它會跟蹤屬性表達式之間的依賴關系,并在依賴關系更改時自動重新驗證屬性值。例如,如果您具有一 個會繼承的屬性(如 FontSize),當繼承該值的元素的父級發生屬性更改時,會自動更新系統。
WPF 屬性系統的基礎是屬性表達式的概念。在 WPF 的第一版中,屬性表達式系統是關閉的,表達式都是作為框架的一部分提供的。表達式致使屬性系統不具有硬編碼的數據綁定、樣式調整或繼承,而是由框架內后面的層來提供這些功能。
屬性系統還提供屬性值的稀疏存儲。因為對象可以有數十個(如果達不到上百個)屬性,并且大部分值處于其默認狀態(被繼承、由樣式設置等),所以并非對象的每個實例都需要具有在該對象上定義的每個屬性的完全權重。
屬性系統的最后一個新功能是附加屬性的概念。WPF 元素是基于組合和組件重用的原則生成的。某些包含元素(如 Grid 布局元素)通常需要子元素上的其他數據才能控制其行為(如行/列信息)。任何對象都可以為任何其他對象提供屬性定義,而不是要將所有這些屬性與每個元素相 關聯。這與 JavaScript 中的“expando”功能相似。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:自互聯網