共用方式為


功能提供者和功能連接器

在 Windows Presentation Foundation (WPF) 或 Silverlight 應用程式中,任何可設計的物件都可以公開任意數目的設計工具擴充功能。 下面的主題將討論功能提供者的功能,以及功能連接器在提供設計階段功能中所扮演的角色。

功能提供者和功能連接器的基本概念

功能提供者是一種輕量型別,可為物件提供更多的設計階段功能。 部分功能提供者可能只提供有關子元件的資訊,不需要代表設計工具執行動作。 其他功能提供者則可將功能表項目加入到物件的設計工具內容功能表、建立自訂裝飾項以供調整大小或編輯,或重新定義在設計工具上拖放物件的方式。

功能提供者的實作方式是直接衍生自 FeatureProvider 類別,或衍生自本身衍生自 FeatureProvider 的類別,例如 AdornerProviderContextMenuProvider。 功能提供者的設計特色是輕量,因此不應該嘗試儲存執行個體之間的狀態。

功能連接器會管理特定物件的一個或多個功能提供者。 功能連接器可透過服務提供者發行新服務,並接聽如選取範圍變更的設計工具事件。 功能連接器的實作方式是從 FeatureConnector<TFeatureProviderType>PolicyDrivenFeatureConnector<TFeatureProviderType> 類別衍生新類別。

功能提供者

功能提供者的目的是要當做輕量擴充點使用。 設計擴充性的常見案例多半是從現有功能提供者類別衍生,而不是建立新的功能連接器。 功能提供者不能用來儲存狀態,因為它們會多次建立和終結。

功能提供者完全由功能連接器所管理,而且透過中繼資料 (特別是 FeatureAttribute) 可與物件產生關聯。 功能連接器會從這個中繼資料找出 FeatureProvider 型別。 對於發現的每個功能提供者,FeatureManager 類別都會識別所需的功能連接器。

常見的功能提供者實作包含選取裝飾項、動詞和屬性編輯器。 如需詳細資訊,請參閱逐步解說:建立設計階段裝飾項

功能提供者的範例

下圖顯示視覺化設計工具以及可能屬於功能提供者或功能連接器分類的功能類型。 請注意,本圖僅用於示範如何實作設計工具的部分功能。

範例功能提供者和連接器

下表列出您可以衍生的功能提供者。

功能提供者

描述

AdornerProvider

將裝飾項加入到設計工具的介面。

PrimarySelectionAdornerProvider

加入供主要選項使用的裝飾項。

ContextMenuProvider

會定義在內容功能表中顯示的一組功能表項目。

PrimarySelectionContextMenuProvider

定義一組功能表項目,供目前選項使用。

PolicyDrivenFeatureConnector<TFeatureProviderType>.ItemFeatureProvider

會識別屬於特定項目的功能提供者。

TaskProvider

將工作加入到使用中的工具。

PrimarySelectionTaskProvider

當類別位於主要選取中,提供可以從選取工具使用的一組工作。

DesignModeValueProvider

擷取使用者在設計工具中所做的屬性變更,並於設計階段提供新的值。

功能提供者在設計階段的建立方式

在許多情況下,您不需要建立自訂功能連接器。 您可以建立功能提供者,然後使用 FeatureConnectorAttribute,使它與類別直接產生關聯。 FeatureManager 類別是 WPF Designer中啟動功能提供者的元件。 只要物件的中繼資料放到設計介面上,FeatureManager 就會立即檢查中繼資料。 如果它找到物件的 FeatureConnectorAttribute,就會建立關聯的功能提供者。

例如,如果您要建立裝飾項,利用這個裝飾項直接在設計工具介面上編輯自訂控制項的標頭文字,就會從本身衍生自 FeatureProviderPrimarySelectionAdornerProvider 衍生裝飾項來實作它。 接下來,您會使用 FeatureConnectorAttribute,使自訂裝飾項與控制項產生關聯。

使功能提供者與型別產生關聯

設計階段工具會透過中繼資料屬性,使功能提供者與型別產生關聯。 中繼資料必須以宣告方式繫結至實際的執行階段物件或執行個體。 此繫結是工具層級所需,並不是由設計階段架構負責。 下圖顯示設計階段工具如何將功能提供者附加到不同的型別。

相關聯的功能提供者和型別

要使功能提供者與 WPF Designer結構中的型別產生關聯,方式有兩種:FeatureAttributeFeatureConnectorAttribute 型別。 FeatureAttribute 型別適用於可編輯物件的型別或執行個體,會公開表示 FeatureProvider 的屬性。

FeatureConnectorAttribute 則會裝飾 FeatureProvider 類別,並指出需要哪種型別的功能連接器來裝載指定的功能提供者。 當您變更傳遞給 FeatureManager 類別的物件時,該類別就會建立所需的 FeatureConnector<TFeatureProviderType> 執行個體。

假設有一個 WPF 專屬設計工具,其中可編輯的物件屬於型別 UIElement。 這種工具可以使用一個或多個「抓取控點」來裝飾個別項目的邊界。 這些裝飾項會以視覺方式表示選項,以供操作這些可編輯的物件。 設計工具會藉由中繼資料,使抓取控點功能與所有型別為 UIElement 的物件產生關聯。 下圖顯示設計工具如何將抓取控點提供者附加到設計介面上的 UIElement

範例功能提供者

如果 UIElement 存在並傳遞到功能管理員進行分析,GrabHandleProvider 就會透過與 UIElement 關聯的中繼資料發現。 GrabHandleProvider 型別本身或其基底型別 (Base Type) 則會藉由中繼資料來檢查,以判斷其所需的功能連接器。

功能連接器

功能連接器是此架構公開的最低層級擴充性。 功能連接器是建立來參考 EditingContext。 功能連接器可以訂閱全域服務,也可以加入連接器自己的服務。 抽象 FeatureConnector<TFeatureProviderType> 類別會實作 IDisposable 介面,以利簡單的清除策略。

功能連接器是視需要而建立。 當 FeatureManagerFeatureProvider 上發現 FeatureConnectorAttribute 時,就會建立指定的 FeatureConnector<TFeatureProviderType> (如果它的型別不存在的話)。 功能連接器只會在發現時建立,而不會讓設計工具工作階段在啟動時建立預設集。 如果 FeatureProvider 有一個以上的 FeatureConnectorAttribute 型別,則所有功能連接器都會初始化。 這可讓協力廠商從現有的 FeatureProvider 衍生、加入自訂功能連接器,並讓這兩組功能都初始化。

FeatureConnector<TFeatureProviderType> 類別的大部分功能都會在受保護的 CreateFeatureProviders 方法中實作。 將物件傳入這個方法會導致功能連接器搜尋該物件的 FeatureAttribute 型別。 如果找到了這些屬性,就會在清單中建立並傳回與每個屬性相關聯的 FeatureProvider 執行個體。

FeatureConnector<TFeatureProviderType> 是泛型基底類別 (Base Class),而且會使用 FeatureConnector<TFeatureProviderType> 所裝載之功能提供者的型別。 功能提供者會使用 FeatureConnectorAttribute 指出相關聯的功能連接器。 FeatureConnector<TFeatureProviderType> 的受保護基底類別方法 (主要是 CreateFeatureProviders 方法) 可將加上型別的功能提供者集合傳回到衍生的功能連接器,而衍生類別無須擔心轉型 (Casting) 和型別安全 (Type Safety)。

建立自訂功能連接器

當您想要接聽設計工具事件 (例如選取範圍) 時,就必須建立自己的功能連接器。 請從 FeatureConnector<TFeatureProviderType>PolicyDrivenFeatureConnector<TFeatureProviderType> 類別衍生來實作您的自訂設計工具邏輯。

功能連接器隨附有設計工具的全域 EditingContext 的參考,透過此參考,功能連接器可存取設計工具服務以及發行自訂服務。 例如,圖表控制項廠商可能會想發行某項服務,讓設計工具中的自訂型別編輯器列舉目前圖表上的所有 Widget。

一旦建立了衍生自 FeatureConnector<TFeatureProviderType> 的類別,就可以將 FeatureConnectorAttribute 套用到功能提供者,使該類別與功能提供者產生關聯。 每當該功能提供者的執行個體建立,FeatureManager 就會檢查 FeatureConnectorAttribute 的中繼資料。 如果定義了該屬性,且關聯 FeatureConnector<TFeatureProviderType> 的執行個體目前不在執行中,FeatureManager 會建立它,而且該功能提供者以後所有的執行個體都會與 FeatureConnector<TFeatureProviderType> 產生關聯。

如需示範如何實作功能連接器的範例程式碼,請參閱 HOW TO:建立自訂功能連接器

請參閱

參考

AdornerProvider

EditingContext

FeatureManager

FeatureConnectorAttribute

其他資源

WPF 設計工具擴充性