將多個 VSPackage 新增至 Visual Studio 時,使用者介面 (UI) 可能會因命令而過度擁擠。 您可以設計套件來協助減少此問題,如下所示:
程序設計套件,使其只有在使用者需要時才會載入它。
將套件程式化,以便只有在集成開發環境(IDE)當前狀態的情境下可能需要時才顯示其命令。
延遲載入
啟用延遲載入的一般方式是設計 VSPackage,使其命令顯示在 UI 中,但在使用者按兩下其中一個命令之前,不會載入套件本身。 若要完成這項作業,請在 .vsct 檔案中建立沒有命令旗標的命令。
下列範例顯示 .vsct 檔案中功能表命令的定義。 這是選取範本中 [ 功能表命令 ] 選項時,Visual Studio 套件範本所產生的命令。
<Button guid="guidTopLevelMenuCmdSet" id="cmdidTestCommand" priority="0x0100" type="Button">
<Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup" />
<Icon guid="guidImages" id="bmpPic1" />
<Strings>
<CommandName>cmdidTestCommand</CommandName>
<ButtonText>Test Command</ButtonText>
</Strings>
</Button>
在此範例中,如果父群組 MyMenuGroup, 是最上層功能表的子系,例如 [ 工具 ] 功能表,該功能表上會顯示命令,但是執行命令的套件在使用者按下命令之前,將不會載入。 不過,藉由編寫命令來實作IOleCommandTarget 介面,您可以在第一次展開包含該命令的功能表時啟用封裝載入。
請注意,延遲載入也可能改善啟動效能。
當前上下文和命令的可見度
您可以根據 VSPackage 資料的目前狀態或目前相關的動作,將 VSPackage 命令程式設計成可見或隱藏。 您可以啟用 VSPackage 來設定它的命令狀態,通常透過使用 QueryStatus 介面中的 IOleCommandTarget 方法的實作來達成。但是,在程式碼執行之前需要先載入 VSPackage。 相反地,我們建議您讓IDE管理命令的可見度,而不需載入套件。 若要這樣做,請在 .vsct 檔案中,將命令與一或多個特殊UI內容產生關聯。 這些 UI 內容是由稱為 命令內容 GUID 的 GUID 來識別。
Visual Studio 會監視用戶動作所產生的變更,例如載入專案或從編輯到建置。 發生變更時,會自動修改 IDE 的外觀。 下表顯示Visual Studio所監視的四個主要IDE變更內容。
| 內容類型 | 說明 |
|---|---|
| 使用中項目類型 | 對於大部分的專案類型,此值 GUID 與實作專案的 VSPackage GUID 相同。 不過,Visual C++專案會使用 [項目類型 GUID ] 作為值。 |
| 活動視窗 | 通常,這是最後一個活動的文件視窗,負責設定用於快捷鍵繫結的當前 UI 內容。 不過,它也可以是一個工具視窗,其快捷鍵綁定表類似於內部網頁瀏覽器。 對於多索引標籤式文件視窗,例如 HTML 編輯器,每個索引標籤都有不同的命令內容 GUID。 |
| 啟用中的語言服務 | 與目前顯示在文本編輯器中的檔案相關聯的語言服務。 |
| 使用中工具視窗 | 開啟且具有焦點的工具視窗。 |
第五個主要內容區域是IDE的UI狀態。 UI 上下文是由使用中的命令上下文 GUID識別,如下所示:
這些 GUID 會根據 IDE 的目前狀態標示為作用中或非使用中。 多個UI內容可以同時作用中。
根據內容隱藏和顯示命令
您可以在 IDE 中顯示或隱藏套件命令,而不需要載入套件本身。 若要這樣做,請使用 DefaultDisabled、 DefaultInvisible和 DynamicVisibility 命令旗標,在封裝的 .vsct 檔案中定義 命令,並將一或多個 VisibilityItem 元素新增至 VisibilityConstraints 區段。 當指定的命令內容 GUID 變成使用中時,命令會顯示而無需載入套件。
自訂上下文 GUID
如果尚未定義適當的命令內容 GUID,您可以在 VSPackage 中定義一個 GUID,然後視需要將其程式設計為作用中或非使用中,以控制命令的可見性。 使用SVsShellMonitorSelection服務來:
藉由呼叫 GetCmdUIContextCookie 方法註冊內容 GUID。
取得內容
GUID的狀態(藉由呼叫 IsCmdUIContextActive 方法)。將上下文
GUID開啟和關閉(透過呼叫 SetCmdUIContext 方法)。謹慎
請確定您的 VSPackage 不會影響任何現有內容 GUID 的狀態,因為其他 VSPackage 可能相依於它們。
範例
下列 VSPackage 命令範例示範命令的動態可見度,該命令是由命令內容所管理,而不需要載入 VSPackage。
命令會設定為在解決方案存在時啟用和顯示;也就是說,每當下列其中一個命令內容 GUID 作用中時:
在範例中,請注意,每個命令旗標都是一個單獨的Command Flag元素。
<Button guid="guidDynamicVisibilityCmdSet" id="cmdidMyCommand"
priority="0x0100" type="Button">
<Parent guid="guidDynamicVisibilityCmdSet" id="MyMenuGroup" />
<Icon guid="guidImages" id="bmpPic1" />
<CommandFlag>DefaultDisabled</CommandFlag>
<CommandFlag>DefaultInvisible</CommandFlag>
<CommandFlag>DynamicVisibility</CommandFlag>
<Strings>
<CommandName>cmdidMyCommand</CommandName>
<ButtonText>My Command name</ButtonText>
</Strings>
</Button>
另請注意,每個UI內容都必須在個別 VisibilityItem 元素中提供,如下所示。
<VisibilityConstraints>
<VisibilityItem guid="guidDynamicVisibilityCmdSet"
id="cmdidMyCommand" context="UICONTEXT_EmptySolution" />
<VisibilityItem guid="guidDynamicVisibilityCmdSet"
id="cmdidMyCommand" context="UICONTEXT_SolutionHasSingleProject" />
<VisibilityItem guid="guidDynamicVisibilityCmdSet"
id="cmdidMyCommand" context="UICONTEXT_SolutionHasMultipleProjects" />
</VisibilityConstraints>