基底項目概觀
在 Windows Presentation Foundation (WPF) 中,有很高比例的類別是從四個類別衍生出來的,這些類別在 SDK 文件中通稱為基礎元素類別。 這些類別包括 UIElement、FrameworkElement、ContentElement 和 FrameworkContentElement。 DependencyObject 類別亦與上述類別有關,因為它是 UIElement 和 ContentElement的常見基底類別
WPF 類別中的基底項目 API
UIElement 和 ContentElement 都衍生自 DependencyObject,但路徑略有不同。 這個層級的分割會處理 UIElement 或 ContentElement 在使用者介面的運用方式,以及它們在應用程式中的用途。 UIElement 在其類別階層中也有 Visual,此為公開 Windows Presentation Foundation (WPF) 較低層級圖形支援的類別。 Visual 透過定義獨立矩形螢幕區域來提供轉譯架構。 實際上,UIElement 適用於將支援較大物件模型的元素,其用途為轉譯和配置可描述為矩形螢幕區域的區域,且內容模型刻意更為開放,以允許不同的元素組合。 ContentElement 並非衍生自 Visual;其模型為被其他東西取用的 ContentElement,例如閱讀程式或檢視器,然後解譯元素並產生完整的 Visual,供 Windows Presentation Foundation (WPF) 取用。 某些 UIElement 類別的用途為提供內容主機服務:它們會為一或多個 ContentElement 類別提供主控和轉譯服務 (DocumentViewer 就是此類別的範例)。 ContentElement 是較小物件模型的元素基底類別,這些元素較常處理可能由 UIElement 託管的文字、資訊或文件內容。
架構層級和核心層級
UIElement 是 FrameworkElement 的基底類別,ContentElement 是 FrameworkContentElement的基底類別。 此下一層級類別存在的原因為支援與 WPF 架構層級不同的 WPF 核心層級,而這項差異也是 API 區分 PresentationCore 與 PresentationFramework 組件的基礎。 WPF 架構層級提供基本應用程式需求的更完整解決方案,包括配置管理員的呈現實作。 WPF 核心層級讓使用者能使用大部分的 WPF,無需承擔其他組件帶來的額外負荷。 在大多數典型的應用程式開發情境中,這些層級之間的差異非常小,而且一般而言,您應將 WPF API 視為一個整體,無需顧慮 WPF 架構層級與 WPF 核心層級之間的差異。 如果您設計的應用程式選擇取代相當數量的 WPF 架構層級功能,例如,如果您的整體方案已有自己的使用者介面 (UI) 組合和版面配置實作,您才需要瞭解層級之間的差異。
選擇要從中衍生的項目
建立延伸性 WPF 自訂類別最實用方法為從 WPF 類別之一衍生,您可以透過現有類別層級盡可能取得所需的功能。 本節列出隨附三個最重要項目類別的功能,協助您決定要從中繼承的類別。
如果您要實作一個控制項 (事實上,這是從 WPF 類別之一衍生較常見的原因之一),您可能會希望自實用控制項類別、控制項系列基底類別,或至少自 Control 基底類別衍生。 如需某些指引和實用範例,請參閱控制項撰寫概觀。
如果您不要建立控制項,而且需要衍生自階層中較高的類別,則下列各節是作為在每個基底項目類別中定義特性的指南。
如果您建立衍生自 DependencyObject 的類別,該類別將會繼承以下功能:
如果您建立衍生自 UIElement 的類別,該類別除了會繼承 DependencyObject 提供的功能,還會繼承以下功能:
如果您建立衍生自 UIElement 的類別,該類別除了會繼承 DependencyObject 提供的功能,還會繼承以下功能:
資料繫結的支援。 如需詳細資訊,請參閱 資料繫結概觀。
動態資源參考的支援。 如需詳細資訊,請參閱 XAML 資源。
屬性值繼承支援,以及中繼資料中協助向架構服務報告屬性條件的其他旗標,例如資料繫結、樣式或配置架構實作。 如需詳細資訊,請參閱架構屬性中繼資料。
邏輯樹狀結構的概念。 如需詳細資訊,請參閱 WPF 中的樹狀結構。
配置系統的實用 WPF 架構層級實作支援,包括 OnPropertyChanged 覆寫,可偵測影響配置的屬性變更。
如果您建立衍生自 UIElement 的類別,該類別除了會繼承 DependencyObject 提供的功能,還會繼承以下功能:
如果您建立衍生自 FrameworkContentElement 的類別,該類別除了會繼承 ContentElement 提供的功能,還會繼承以下功能:
資料繫結的支援。 如需詳細資訊,請參閱 資料繫結概觀。
動態資源參考的支援。 如需詳細資訊,請參閱 XAML 資源。
屬性值繼承支援,以及中繼資料中協助向架構服務報告屬性條件的其他旗標,例如資料繫結、樣式或配置架構實作。 如需詳細資訊,請參閱架構屬性中繼資料。
您不會繼承版面配置系統修改存取權 (例如 ArrangeOverride)。 版面配置系統實作僅適用於 FrameworkElement。 不過,您會繼承 OnPropertyChanged 覆寫,可偵測影響配置的屬性變更,並向任何內容主機報告這些屬性變更。
會記錄各種類別的內容模型。 如果您想要尋找從中衍生的適當類別,則類別的內容模型是您應該考慮的一個可能因素。 如需詳細資訊,請參閱 WPF 內容模型。
其他基底類別
DispatcherObject
DispatcherObject 可支援 WPF 執行緒模式,並使所有為 WPF 應用程式建立的物件都能與 Dispatcher相關聯。 即使您不是衍生自 UIElement、DependencyObject 或 Visual,您也應該考慮衍生自 DispatcherObject,以取得此執行緒模式支援。 如需詳細資訊,請參閱執行緒模型。
視覺效果
Visual 可實作 2D 物件概念,而 2D 物件一般需要在大致呈矩形的區域中視覺化呈現。 實際轉譯 Visual 發生在其他類別中 (它並非獨立式),但 Visual 類別提供的已知類型可供各層級的轉譯處理序使用。 Visual 可實作點擊測試,但不會公開報告點擊測試陽性事件 (這些事件會在 UIElement 中)。 如需詳細資訊,請參閱視覺分層程式設計。
Freezable
Freezable 能模擬可變物件的不變性,方法為當基於效能考量需要或想要不可變物件時,提供產生物件副本的方法。 Freezable 類型可提供特定圖形要素 (例如幾何圖形、筆刷和動畫) 的通用基礎。 值得注意的是,Freezable 並非 Visual;當套用 Freezable 來填入另一個物件的屬性值時,它可以保留成為子屬性的屬性,而這些子屬性可能會影響轉譯。 如需詳細資訊,請參閱 Freezable 物件概觀。
Animatable 是衍生自 Freezable 的類別,它特別新增動畫控制項層級和部分公用程式成員,以便區分目前的動畫屬性和非動畫屬性。
控制
Control 是物件類型的預期基底類別,依據不同的技術,可稱為控制項或元件。 一般而言,WPF 控制項是直接代表 UI 控制項或密切參與控制項組合的類別。 啟用 Control 的主要功能為將控制項範本化。