部署自訂控制項和設計階段屬性
當設計工具開啟自訂控制項的組件時,也會尋找相關的設計階段組件。 特別是,設計工具會尋找具有 ProvideMetadataAttribute 組件層級屬性的組件。 在找到這個屬性後,設計工具便會在組件中搜尋實作 IProvideAttributeTable 介面的類別。 設計工具會查詢這個類別的 AttributeTable 屬性 (Property),找出指定設計階段行為的屬性 (Attribute) 集合。
設計階段組件的命名慣例
設計工具 (例如 Visual Studio 和 Expression Blend) 會使用命名慣例來探索您的自訂設計階段組件。 這個慣例是歷經不同工具版本逐漸發展成形。 請使用下表,針對適當的目標設計工具來命名您的組件。
目標環境 |
命名規範 |
範例名稱 |
---|---|---|
Expression Blend 3 和 Visual Studio 2010 |
<ControlLibrary>.Design.<version>.dll (通用) <ControlLibrary>.Expression.Design.<version>.dll (Expression Blend) <ControlLibrary>.VisualStudio.Design.<version>.dll (Visual Studio) |
TailspinToysControls.Design.4.0.dll TailspinToysControls.Expression.Design.4.0.dll TailspinToysControls.VisualStudio.Design.4.0.dll |
Expression Blend 2 和 Visual Studio 2008 |
<ControlLibrary>.Design.dll (通用) <ControlLibrary>.Expression.Design.dll (Expression Blend) <ControlLibrary>.VisualStudio.Design.dll (Visual Studio) |
TailspinToysControls.Design.dll TailspinToysControls.Expression.Design.dll TailspinToysControls.VisualStudio.Design.dll |
「通用」意指 Visual Studio 和 Expression Blend 共用的設計階段實作。 <version> 子字串指定 WPF Designer架構的對應版本。 您可以透過檢查 Microsoft.Windows.Design.dll 組件的版本來做確認。
工具專屬的設計階段組件可以覆寫通用組件中的共用實作。 這表示您在不同設計工具中的自訂設計經驗可能會有很大的差異。 如需詳細資訊,請參閱 提供設計階段中繼資料。
註冊設計階段組件
使用組件資料夾註冊程序 (也稱為 AssemblyFoldersEx 註冊) 來註冊控制項及其相關的設計階段組件。 若要使用組件資料夾註冊程序來註冊控制項,您只需要將控制項組件放在磁碟上,並指定工具箱登錄項目。 這個註冊程序可以在安裝 Visual Studio 之前或之後進行。
AssemblyFoldersEx 是每個目標 Framework 版本 (例如 Silverlight 3 或 .NET Framework 4) 底下的登錄機碼。 AssemblyFoldersEx 則包括一組機碼,用來指定內含架構專屬組件的資料夾。 例如,若以 Silverlight 3 為目標,AssemblyFoldersEx 登錄機碼就會位於下列登錄路徑中。
[HKCU 或 HKLM]\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Silverlight\v3.0\AssemblyFoldersEx
當 Toolbox 子機碼及其支援項目是在 AssemblyFoldersEx 機碼底下建立時,控制項便會出現在工具箱、[加入參考] 對話方塊和 [選擇項目] 對話方塊中。
下表列出可在 AssemblyFoldersEx 和 Toolbox 機碼中用來註冊組件資料夾的登錄項目。
登錄項目 |
登錄項目類型 |
描述 |
範例 |
---|---|---|---|
<assembly> |
機碼 |
機碼的名稱,通常會加上品牌。 |
[TailspinToys Controls] |
<assembly folder> |
預設字串值 |
指定自訂控制項組件的完整安裝路徑。 設計工具將會在這個資料夾以及名為 Design 的子資料夾中搜尋設計階段組件。 |
@="c:\\Program Files\\Reference Assemblies\\TailspinToys Controls\\Bin\\" |
Toolbox |
機碼 |
如果您要在 <assembly folder> 中的組件裡搜尋要新增到工具箱的控制項,請加入 Toolbox 機碼。 若未指定此機碼,控制項會出現在 [選擇項目] 對話方塊中,而組件則會出現在 [加入參考] 對話方塊,但不會出現在工具箱裡。 |
[Toolbox] |
TabName |
字串值 |
為 <assembly folder> 中的控制項指定預設工具箱群組。 如果群組不存在,則會建立群組。 如果沒有指定值,控制項會安裝到平台的預設群組中。 請使用這個值來指定品牌,而非功能分類。 請勿以 [通用] 或 [所有控制項] 分類做為 WPF 和 Silverlight 自訂控制項的目標。 這個值無法當地語系化。 |
"TabName"="TailspinToys" |
Servicing |
索引鍵 |
若要強制工具箱快取重新整理,請在 Toolbox 金鑰內指定新的金鑰或值。 執行這項作業的建議作法是建立 Updates 子金鑰,並在其中包含每個已安裝之更新的註冊值。 快取重新整理只適用於 Toolbox 金鑰所屬特定資料夾中的控制項,而不是所有的架構控制項。 使用者對組件資料夾控制項所做的工具箱自訂,可能會在重新整理組件資料夾時消失。 |
[Updates] "Update3"="1" "Update7"="1" |
下列範例登錄指令碼會註冊以 .NET Framework 4 為目標且位於 Reference Assemblies 路徑的組件。 將 ToolboxBrowsableAttribute 設定為 true 的任何控制項都會顯示在工具箱的 [Tailspin Toys] 索引標籤底下。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0\AssemblyFoldersEx\TailspinToys]
@="c:\\\\Program Files\\\\Reference Assemblies\\\\TailspinToys Controls\\\\Bin\\\\"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0\AssemblyFoldersEx\TailspinToys\Toolbox]
"TabName"="Tailspin Toys"
ToolboxBrowsableAttribute 和 Toolbox 登錄機碼
您可以藉由將 ToolboxBrowsableAttribute 加入至自訂控制項的設計階段中繼資料,指定是否要讓該控制項出現在工具箱中。 如需詳細資訊,請參閱逐步解說:提供工具箱圖示的中繼資料。
[選擇項目] 對話方塊可用來瀏覽到新組件,以及將新控制項加入至工具箱。 下表顯示 ToolboxBrowsableAttribute 和 Toolbox 登錄機碼之間的互動,如何決定自訂控制項出現在工具箱和 [選擇項目] 對話方塊的時機。
Toolbox 登錄機碼 |
沒有 Toolbox 登錄機碼 |
|
ToolboxBrowsable = true |
|
|
ToolboxBrowsable = false |
|
|
載入設計階段組件
設計工具會依照特定順序載入您的自訂組件。 這種作法讓設計工具專屬實作能夠取代泛型實作。 下列清單針對部署在名為 ControlLibrary.dll 之組件的自訂控制項,顯示設計階段組件的載入順序。
ControlLibrary.dll (控制項組件)
ControlLibrary.Design.<version>.dll
Design\ControlLibrary.Design.<version>.dll
ControlLibrary.[Expression|VisualStudio].Design.<version>.dll
Design\ControlLibrary.[Expression|VisualStudio].Design.<version>.dll
設計工具專屬的組件會取代部署在泛型組件中的實作。 例如,TailspinToysControlLibrary.VisualStudio.Design.dll 可以取代 TailspinToysControlLibrary.Design.dll 中的實作。
此外,設計階段組件也會根據其檔案名稱中指定的 <version> 來載入。 下列規則顯示設計工具如何解譯 <version>。
如果 <version> 擁有的主要版本號碼與設計工具的架構版本不同,設計組件就不會載入。
如果有多個設計階段組件與設計工具的架構版本相容,設計工具便會載入針對未超過設計工具架構版本的最高架構版本所編譯的版本。
下表顯示以載入四個不同版本之設計階段組件的 4.1.3.0 架構版本所建置的設計工具範例。
範例設計階段組件名稱 |
設計工具是否載入? |
---|---|
ControlLibrary.Design.3.0.1.0.dll |
否。 不相容的版本。 |
ControlLibrary.Design.4.0.1.0.dll |
否。 會載入,但有較高版本可用。 |
ControlLibrary.Design.4.1.1.0.dll |
是。 最接近設計工具的版本。 |
ControlLibrary.Design.4.3.dll |
否。 根據高於設計工具的架構版本來建置。 |
重新整理工具箱
更新 AssemblyFoldersEx 機碼指定之資料夾中的組件時,您可能需要重新整理 Visual Studio 工具箱快取。 這個快取包含出現在工具箱中之控制項的名稱、分類和圖示。 此快取不包含控制項或設計階段組件。在編譯專案時,任何服務式控制項或設計階段組件都會自動重新整理。
如果 AssemblyFoldersEx 機碼有任何改變 (它的任何值或子機碼發生變更),組件資料夾的工具箱快取都會更新。 這項更新會在工具箱初始化期間第一次顯示 [工具箱] 工作窗格時 (通常是在 Visual Studio 開機或專案載入時) 發生。
若要強制工具箱快取重新整理,請在 Toolbox 金鑰內指定新的金鑰或值。 執行這項作業的建議作法是建立 Servicing 子機碼,然後在其中包含每個已安裝之更新的註冊值。 快取重新整理只適用於 Toolbox 金鑰所屬特定資料夾中的控制項,而不是所有的架構控制項。 使用者對組件資料夾控制項所做的工具箱自訂,可能會在重新整理組件資料夾時消失。