共用方式為


WPF 設計工具擴充性架構

WPF Designer for Visual Studio 是 WPF 和 Silverlight 項目的視覺化編輯環境。 WPF 設計工具的設計概念為一套可擴充的架構,您可以擴充這個架構,豐富個人的設計體驗。

您可以擴充 WPF 設計工具架構,以大幅自訂 WPF 和 Silverlight 內容的設計階段外觀和行為。 例如,可以透過下列方式來擴充 WPF 設計工具:

  • 使用進階圖形自訂移動及調整圖像 (Glyph) 大小的功能。

  • 將可用來變更控制項狀態的捷徑功能表加入至設計介面。

  • 修改控制項在不同工具中的設計階段外觀和行為。

WPF 設計工具架構支援 WPF 和 Silverlight 完整的表現功能, 因此可以營造許多以前無法實現的視覺化設計效果。

如需如何針對 WPF 和 Visual Studio 實作自訂設計階段體驗的範例,請參閱逐步解說:建立設計階段裝飾項。 

如需示範如何建立 WPF 和 Silverlight 自訂設計體驗的範例程式碼,請參閱 WPF 設計工具擴充性範例 網站 (英文)。

WPF 設計工具架構

WPF 設計工具屬於模組化的架構,這表示您在擴充設計階段時,只需擴充您的功能所需要的項目, 因此您不需要撰寫大量的支援程式碼來啟用自訂設計功能。

這個物件模型包含下表說明的五個功能單元。

功能單元

說明

編輯模型

設計工具中物件的程式設計介面。

功能提供者

設計工具架構中的主要擴充點。

編輯內容

設計工具狀態的集中存放區。

命令、工作和工具

處理使用者輸入的命令、工作和工具。

設計階段中繼資料

包含控制項設計階段行為的組件,這些組件可以具體區分設計工具的邏輯和執行階段的邏輯。

下圖顯示 WPF 設計工具架構的功能單元。

高階物件模型

編輯模型

設計環境是透過一個稱為編輯模型的程式設計介面,操作執行階段的控制項。 這個編輯模型包含三個功能子單元:模型、擷取該模型的公用包裝函式,以及代表該模型之使用者介面 (UI) 的檢視。

設計環境使用 ModelItem 型別與基礎模型通訊。 所有的變更都是針對 ModelItem 包裝函式進行,然後再由包裝函式影響基礎模型, 如此便可讓模型保持簡單。 ModelItem 包裝函式會處理複雜的設計工具功能,例如交易支援、復原追蹤和變更通知等。

ModelService 類別提供編輯模型和全域事件通知的進入點 (Entry Point)。

ViewService 類別會將視覺化表示對應至基礎模型項目。

這兩項服務都是設計工具正常運作不可或缺的要件。 DesignerView 類別 (負責處理使用者輸入,並將輸入路由至命令) 需要這兩項服務,才能將使用者輸入正確對應回模型。

功能提供者

您可以使用 FeatureProviderFeatureConnector<TFeatureProviderType> 類別,擴充型別的設計階段行為。 FeatureConnector<TFeatureProviderType> 類別負責管理 FeatureProvider 物件的清單。

FeatureProvider 類別提供最基本的擴充點。 功能提供者屬於輕量型的功能或是增益集,通常不需要設計環境的太多資源,而且都是在指定的內容中建立及部署。 功能提供者可用來新增 UI 位元至設計介面,或是修改某些基本行為。 例如,功能提供者可以加入更多的抓取控點,或是提供新的滑鼠拖曳行為類型。

若要達到最深的擴充性層級,請從 FeatureConnector<TFeatureProviderType> 類別衍生。 這個類別會公開服務提供者,而衍生的功能連接器類別可以透過這個服務提供者處理事件,並要求及發佈服務。 例如,您可以實作功能連接器,以提供選取範圍 UI,或物件特定序列化 (Serialization).

一般而言,實作功能可擴充現有的概念, 而實作功能連接器則可提供新的概念。 如需詳細資訊,請參閱功能提供者和功能連接器

編輯內容

執行中的設計工具會累積相當可觀的狀態資訊。 例如,設計工具的狀態可能包括已選取哪些物件,或是按下滑鼠左鍵時所發生的行為。 設計工具狀態儲存在集中的位置,如此您就可以在需要時找到這些狀態。 EditingContext 類別代表設計工具狀態的這個集中儲存機制。

EditingContext 類別將狀態分成兩大類:資料和行為。 資料會儲存成內容項目資料表,而行為則儲存成服務資料表。 這兩個資料表都是使用型別式的索引鍵編製索引,也都可以列舉。

ContextItem 類別保留設計工具中狀態的單一部分。 內容項目是不變的,但是新的內容項目可以取代現有的內容項目,以模擬可變動性。

透過會傳回 ServiceManager 執行個體的 Services 屬性,可以存取服務,而透過會傳回 ContextItemManager 執行個體的 Items 屬性,可以存取內容項目。

命令、工作和工具

WPF 設計工具工具架構包含命令、工作和工具。 

「命令」(Command) 是代表某種行為的唯一識別項。 例如,[剪下] 就是代表將目前的文字剪下並將其加入至 [剪貼簿] 的命令。 實作 [剪下] 的程式碼會因為應用程式不同而改變,甚至在同一種應用程式內也會不同。 例如,在 Word 文件中剪下文字和在同一份文件中剪下搜尋文字方塊中的文字,這兩個動作就分屬於不同的實作。 無論哪一種實作,[剪下] 命令都是一樣的。

WPF 設計工具透過引進工具命令的概念,擴大了 WPF 的命令體系。 工具命令會實作 ICommand 介面,與 RoutedCommand 類別十分類似。

「工作」(Task) 具有命令繫結集合,可以讓您加入路由命令。 DesignerView 類別擁有程式碼,而該程式碼使用相同的路由策略做為工具命令,以尋找及執行工作中定義的路由命令。 DesignerView 類別可啟用支援通用 WPF 命令 (例如 Copy) 的工作。

「工具」(Tool) 是負責處理使用者輸入的一種類別。 所有的使用者輸入都是以一個或多個輸入事件的形式進入設計工具。 這些輸入事件會傳遞至目前使用中的工具,再由該工具將輸入事件轉換成輸入繫結。 如果傳回輸入繫結,系統就會執行繫結內的命令。

工具可以代表設計工具的全域模式。 例如,如果使用者在設計介面上選取元件,就有可能出現該選取模式,因為目前使用中的工具會提供處理選取作業的輸入繫結和命令。 當使用者建立控制項的新執行個體時,不同的工具就會開始作用,並提供一組繫結到相同輸入繫結的不同命令。

設計階段中繼資料

在 WPF 設計工具架構中,定義控制項設計階段行為的中繼資料由屬性指定,並會納入一個獨立組件中。 不同的設計工具可以搭配完全不同的設計階段實作,來使用不同的中繼資料組件。 如此便可區隔執行階段和設計階段行為,讓您直接修改設計工具,而不影響到控制項。

若要指定提供設計階段實作的組件,請以 ProvideMetadataAttribute 標記該組件,並包含實作 IProvideAttributeTable 介面的類別。

如需詳細資訊,請參閱 提供設計階段中繼資料

Expression Blend 中的設計階段支援

WPF 設計工具支援擴充性架構中的所有功能。 Expression Blend 支援下列功能。

Expression Blend 不支援 ParentAdapterPlacementAdapter

WPF 設計工具組件

WPF 設計工具包含數個組件,而這些組件分屬於下列三種分類中的一種:公用、私用和設計工具專用。

公用組件公開的類別可用來將設計階段邏輯加入至控制項。

私用和設計工具專用組件可定義 WPF 設計工具的功能集,以及這套工具與設計工具 (如 Visual Studio 和 Expression Blend) 的互動。

WPF 和 Silverlight 設計工具做為單一實體安裝。 每一個設計工具都沒有單獨封裝。

下表顯示 WPF 設計工具功能是如何部署的。

組件

公用 API

說明

Microsoft.Windows.Design.Extensibility.dll

透過屬性和 Visual Studio SDK 整合邏輯,提供擴充性模型。

Microsoft.Windows.Design.Interaction.dll

提供使用者輸入和顯示類別。

Microsoft.Windows.Design.Markup.dll

提供 XAML 和文件模型機制。

Microsoft.VisualStudio.Xaml.dll

透過服務與資料後擋板,以及中繼資料的操作,提供任何設計工具的基本 XAML 基礎。

Microsoft.Windows.Design.Host.dll

用於裝載設計工具的私用 API (Visual Studio 專用)。

Microsoft.Windows.Design.Developer.dll

WPF 設計工具 實作。

Microsoft.Windows.Design.Developer.WPF.dll

Microsoft.Windows.Design.Developer.Silverlight.dll

Microsoft.Windows.Design.Platform.dll

使用抽象類別的平台層。 平台實作在這個組件中實作抽象類別。

Microsoft.Windows.Design.Platform.WPF.dll

WPF 的平台專屬設計階段。

Microsoft.Windows.Design.Platform.Silverlight.dll

Silverlight 的平台專屬設計階段。

Microsoft.Expression.DesignModel.dll

Expression Blend 設計階段組件。

Microsoft.Expression.Platform.WPF.dll

Expression Blend 設計階段組件。

Microsoft.Expression.Platform.Silverlight.dll

Expression Blend 設計階段組件。

注意事項注意事項

組件代表功能界限,而非命名空間界限。 您經常會發現跨越多個組件的命名空間。

WPF 設計工具和 Windows Form 設計工具架構

WPF 設計工具的架構和 Windows Form 設計工具架構的差異非常大,後者的特色是有 IComponent 介面和 System.ComponentModel 命名空間。 如需詳細資訊,請參閱比較 Windows Form 設計工具架構與 WPF 設計工具架構

請參閱

概念

功能提供者和功能連接器

其他資源

提供設計階段中繼資料

在設計階段開發 Windows Form 控制項

WPF 設計工具擴充性