WPF 設計工具擴充性架構
WPF Designer for Visual Studio 是 WPF 和 Silverlight 項目的視覺化編輯環境。 WPF Designer的設計概念為一套可擴充的架構,您可以擴充這個架構,豐富個人的設計體驗。
您可以擴充 WPF Designer架構,以大幅自訂 WPF 和 Silverlight 內容的設計階段外觀和行為。 例如,可以透過下列方式來擴充 WPF Designer:
使用進階圖形自訂移動及調整圖像 (Glyph) 大小的功能。
將可用來變更控制項狀態的捷徑功能表加入至設計介面。
修改控制項在不同工具中的設計階段外觀和行為。
WPF Designer架構支援 WPF 和 Silverlight 完整的表現功能, 因此可以營造許多以前無法實現的視覺化設計效果。
如需如何針對 WPF 和 Visual Studio 實作自訂設計階段體驗的範例,請參閱逐步解說:建立設計階段裝飾項。
如需示範如何建立 WPF 和 Silverlight 自訂設計體驗的範例程式碼,請參閱 WPF 設計工具擴充性範例 網站 (英文)。
WPF 設計工具架構
WPF Designer屬於模組化的架構,這表示您在擴充設計階段時,只需擴充您的功能所需要的項目, 因此您不需要撰寫大量的支援程式碼來啟用自訂設計功能。
這個物件模型包含下表說明的五個功能單元。
功能單元 |
描述 |
---|---|
編輯模型 |
設計工具中物件的程式設計介面。 |
功能提供者 |
設計工具架構中的主要擴充點。 |
編輯內容 |
設計工具狀態的集中存放區。 |
命令、工作和工具 |
處理使用者輸入的命令、工作和工具。 |
設計階段中繼資料 |
包含控制項設計階段行為的組件,這些組件可以具體區分設計工具的邏輯和執行階段的邏輯。 |
下圖顯示 WPF Designer架構的功能單元。
編輯模型
設計環境是透過一個稱為編輯模型的程式設計介面,操作執行階段的控制項。 這個編輯模型包含三個功能子單元:模型、擷取該模型的公用包裝函式,以及代表該模型之使用者介面 (UI) 的檢視。
設計環境使用 ModelItem 型別與基礎模型通訊。 所有的變更都是針對 ModelItem 包裝函式進行,然後再由包裝函式影響基礎模型, 如此便可讓模型保持簡單。 ModelItem 包裝函式會處理複雜的設計工具功能,例如交易支援、復原追蹤和變更通知等。
ModelService 類別提供編輯模型和全域事件通知的進入點 (Entry Point)。
ViewService 類別會將視覺化表示對應至基礎模型項目。
這兩項服務都是設計工具正常運作不可或缺的要件。 DesignerView 類別 (負責處理使用者輸入,並將輸入路由至命令) 需要這兩項服務,才能將使用者輸入正確對應回模型。
功能提供者
您可以使用 FeatureProvider 或 FeatureConnector<TFeatureProviderType> 類別,擴充型別的設計階段行為。 FeatureConnector<TFeatureProviderType> 類別負責管理 FeatureProvider 物件的清單。
FeatureProvider 類別提供最基本的擴充點。 功能提供者屬於輕量型的功能或是增益集,通常不需要設計環境的太多資源,而且都是在指定的內容中建立及部署。 功能提供者可用來新增 UI 位元至設計介面,或是修改某些基本行為。 例如,功能提供者可以加入更多的抓取控點,或是提供新的滑鼠拖曳行為類型。
若要達到最深的擴充性層級,請從 FeatureConnector<TFeatureProviderType> 類別衍生。 這個類別會公開服務提供者,而衍生的功能連接器類別可以透過這個服務提供者處理事件,並要求及發佈服務。 例如,您可以實作功能連接器,以提供選取範圍 UI,或物件特定序列化 (Serialization).
一般而言,實作功能可擴充現有的概念, 而實作功能連接器則可提供新的概念。 如需詳細資訊,請參閱功能提供者和功能連接器。
編輯內容
執行中的設計工具會累積相當可觀的狀態資訊。 例如,設計工具的狀態可能包括已選取哪些物件,或是按下滑鼠左鍵時所發生的行為。 設計工具狀態儲存在集中的位置,如此您就可以在需要時找到這些狀態。 EditingContext 類別代表設計工具狀態的這個集中儲存機制。
EditingContext 類別將狀態分成兩大類:資料和行為。 資料會儲存成內容項目資料表,而行為則儲存成服務資料表。 這兩個資料表都是使用型別式的索引鍵編製索引,也都可以列舉。
ContextItem 類別保留設計工具中狀態的單一部分。 內容項目是不變的,但是新的內容項目可以取代現有的內容項目,以模擬可變動性。
透過會傳回 ServiceManager 執行個體的 Services 屬性,可以存取服務,而透過會傳回 ContextItemManager 執行個體的 Items 屬性,可以存取內容項目。
命令、工作和工具
WPF Designer工具架構包含命令、工作和工具。
「命令」(Command) 是代表某種行為的唯一識別項。 例如,[剪下] 就是代表將目前的文字剪下並將其加入至 [剪貼簿] 的命令。 實作 [剪下] 的程式碼會因為應用程式不同而改變,甚至在同一種應用程式內也會不同。 例如,在 Word 文件中剪下文字和在同一份文件中剪下搜尋文字方塊中的文字,這兩個動作就分屬於不同的實作。 無論哪一種實作,[剪下] 命令都是一樣的。
WPF Designer透過引進工具命令的概念,擴大了 WPF 的命令體系。 工具命令會實作 ICommand 介面,與 RoutedCommand 類別十分類似。
「工作」(Task) 具有命令繫結集合,可以讓您加入路由命令。 DesignerView 類別擁有程式碼,而該程式碼使用相同的路由策略做為工具命令,以尋找及執行工作中定義的路由命令。 DesignerView 類別可啟用支援通用 WPF 命令 (例如 Copy) 的工作。
「工具」(Tool) 是負責處理使用者輸入的一種類別。 所有的使用者輸入都是以一個或多個輸入事件的形式進入設計工具。 這些輸入事件會傳遞至目前使用中的工具,再由該工具將輸入事件轉換成輸入繫結。 如果傳回輸入繫結,系統就會執行繫結內的命令。
工具可以代表設計工具的全域模式。 例如,如果使用者在設計介面上選取元件,就有可能出現該選取模式,因為目前使用中的工具會提供處理選取作業的輸入繫結和命令。 當使用者建立控制項的新執行個體時,不同的工具就會開始作用,並提供一組繫結到相同輸入繫結的不同命令。
設計階段中繼資料
在 WPF Designer架構中,定義控制項設計階段行為的中繼資料由屬性指定,並會納入一個獨立組件中。 不同的設計工具可以搭配完全不同的設計階段實作,來使用不同的中繼資料組件。 如此便可區隔執行階段和設計階段行為,讓您直接修改設計工具,而不影響到控制項。
若要指定提供設計階段實作的組件,請以 ProvideMetadataAttribute 標記該組件,並包含實作 IProvideAttributeTable 介面的類別。
如需詳細資訊,請參閱 提供設計階段中繼資料。
Expression Blend 中的設計階段支援
WPF Designer支援擴充性架構中的所有功能。 Expression Blend 支援下列功能。
裝飾項
內容功能表
預設初始設定式
所有 ModelItem 功能,如選取和操作
屬性視窗擴充性
Expression Blend 不支援 ParentAdapter 和 PlacementAdapter。
WPF 設計工具組件
WPF Designer包含數個組件,而這些組件分屬於下列三種分類中的一種:公用、私用和設計工具專用。
公用組件公開的類別可用來將設計階段邏輯加入至控制項。
私用和設計工具專用組件可定義 WPF Designer的功能集,以及這套工具與設計工具 (如 Visual Studio 和 Expression Blend) 的互動。
WPF 和 Silverlight 設計工具做為單一實體安裝。 每一個設計工具都沒有單獨封裝。
下表顯示 WPF Designer功能是如何部署的。
Assembly |
公用 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 Designer 實作。 |
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 Designer的架構和 Windows Form 設計工具架構的差異非常大,後者的特色是有 IComponent 介面和 System.ComponentModel 命名空間。 如需詳細資訊,請參閱比較 Windows Form 設計工具架構與 WPF 設計工具架構。