共用方式為


讓命令可供使用

將多個 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 中顯示或隱藏套件命令,而不需要載入套件本身。 若要這樣做,請使用 DefaultDisabledDefaultInvisibleDynamicVisibility 命令旗標,在封裝的 .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>