設計工具初始化和中繼資料組態
操作與設計工具或設計工具元件相關聯的中繼資料和篩選屬性提供一種機制,讓應用程式定義特定設計工具用來處理不同 Type 物件 (例如資料結構、類別或圖形實體),設計工具何時可供使用,以及如何設定 Visual Studio IDE 來支援設計工具 (例如可用的 [工具箱] 類別或索引標籤)。
Visual Studio SDK 提供數種機制,可協助控制設計工具或設計工具元件的初始化,以及 VSPackage 對其中繼資料的操作。
初始化中繼資料和組態資訊
因為 VSPackages 會視需要載入,所以在設計工具具現化之前,Visual Studio 環境可能尚未載入 VSPackages。 因此,VSPackages 無法使用標準機制在建立時設定設計工具或設計工具元件,也就是處理 DesignerCreated 事件。 相反地,VSPackage 會實作 DesignSurfaceExtension 介面的執行個體,並自行註冊以提供自訂專案,稱為設計介面擴充。
自訂初始化
自訂設計工具、元件或設計工具介面牽涉到:
修改設計工具中繼資料,並有效地變更存取或轉換特定 Type 的方式。
這通常是透過 UITypeEditor 或 TypeConverter 機制來完成。
例如,當初始化以 System.Windows.Forms 為基礎的設計工具時,Visual Studio 環境會修改與設計工具搭配使用之 UITypeEditor 物件的 Image,以使用資源管理員來取得點陣圖,而不是檔案系統。
例如,藉由訂閱事件或取得專案組態資訊,與環境整合。 您可以藉由取得 ITypeResolutionService 介面來取得專案組態資訊並訂閱事件。
藉由啟用適當的 Toolbox 類別,或藉由將 ToolboxItemFilterAttribute 類別的執行個體套用至設計工具來限制設計工具的適用性,以修改使用者環境。
透過 VSPackage 的設計工具初始化
VSPackage 應該透過以下方式處理設計工具初始化:
建立實作 DesignSurfaceExtension 類別的物件。
注意
DesignSurfaceExtension 類別絕不應該在與 Package 類別相同的物件上實作。
註冊實作 DesignSurfaceExtension 的類別,為 VSPackage 設計工具延伸模組支援。 將 DesignSurfaceExtensionAttribute、ProvideObjectAttribute 和 ProvideServiceAttribute 的執行個體套用至提供 VSPackage Package 實作的類別,以註冊類別。
每當建立設計工具或設計工具元件時,Visual Studio 環境會:
存取每個已註冊的設計介面擴充提供者。
具現化並初始化每個設計介面擴充提供者之 DesignSurfaceExtension 物件的執行個體。
呼叫每個設計介面擴充提供者的 OnDesignerCreated 方法或 OnComponentCreated 方法 (適當時)。
將 DesignSurfaceExtension 物件實作為 VSPackage 的成員時,請務必了解:
Visual Studio 環境無法控制特定
DesignSurfaceExtension
提供者修改哪些中繼資料或其他組態設定。 兩個或多個DesignSurfaceExtension
提供者可能會以衝突的方式修改相同的設計工具功能,最終修改具決定性。 最後一次套用的是哪項修改並不確定。可以明確地將 DesignSurfaceExtension 物件的實作限制為特定設計工具,方法是將 ToolboxItemFilterAttribute 的執行個體套用至該實作。 如需有關 Toolbox 項目篩選的詳細資訊,請參閱 ToolboxItemFilterAttribute 和 ToolboxItemFilterType。
其他中繼資料部署
VSPackage 可以變更設計工具或設計工具元件在設計階段以外的組態。
可以程式設計的方式使用 ProvideDesignerMetadataAttribute 類別,或套用至提供設計工具的 VSPackage。
ProvideDesignerMetadataAttribute 類別的執行個體可用來修改設計介面上建立之元件的中繼資料。 例如,物件可以使用自訂屬性瀏覽器取代物件所使用的 CommonDialog 預設屬性瀏覽器。
套用至 VSPackage 之 Package 實作的 ProvideDesignerMetadataAttribute 執行個體所提供的修改可以有兩個範圍之一:
全域 -- 指定元件的所有新執行個體
本機 -- 僅適用於目前 VSPackage 所提供之設計介面上所建立之元件的執行個體。
套用至 VSPackage 之 Package 實作的 ProvideDesignerMetadataAttribute 執行個體的 IsGlobal
屬性會決定此範圍。
將屬性套用至 Package 的實作,並將 ProvideDesignerMetadataAttribute 物件的 IsGlobal 屬性設定為 true
,如下所示,會變更整個 Visual Studio 環境的瀏覽器:
[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser),
IsGlobal=true
)]
internal class MyPackage : Package {}
如果全域旗標設定為 false
,則中繼資料變更是目前 VSPackage 所支援之目前設計工具的本機:
[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser),
IsGlobal=false
)]
internal class MyPackage : Package {}
注意
設計介面只支援建立元件,因此只有元件可以有本機中繼資料。 在上面的範例中,我們嘗試修改屬性,例如物件的 Color
屬性。 如果已為全域旗標傳入 false
,則 CustomBrowser
始終不會出現,因為設計工具永遠不會實際建立 Color
的執行個體。 將全域旗標設定為 false
對於控制項、計時器和對話方塊等元件很有用。