提供可用的命令

將多個 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 來設定其命令的狀態,通常是使用 IOleCommandTarget 介面的 QueryStatus 方法實作,但這需要先載入 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 命令旗標並將一個或多個 VisibilityItem 元素新增至 [VisibilityConstraints] 區段,在套件的 .vsct 檔案中定義該命令。 當指定的命令內容 GUID 變成使用中時,將顯示該命令而不載入套件。

自訂內容 GUID

如果尚未定義適當的命令內容 GUID,您可以在 VSPackage 中定義一個 GUID,然後視需要將其程式設計為使用中或非使用中,以控制命令的可見性。 使用 SVsShellMonitorSelection 服務可以:

  • 註冊內容 GUID (藉由呼叫 GetCmdUIContextCookie 方法)。

  • 取得內容 GUID 的狀態 (藉由呼叫 IsCmdUIContextActive 方法)。

  • 開啟和關閉內容 GUID (藉由呼叫 SetCmdUIContext 方法)。

    警告

    請確定您的 VSPackage 不會影響任何現有內容 GUID 的狀態,因為其他 VSPackage 可能受它們影響。

範例

下列 VSPackage 命令範例示範由命令內容管理的命令動態可見性,而無需載入 VSPackage。

命令設定為在方案存在時啟用和顯示;也就是說,每當使用下列其中一個命令內容 GUID 時:

在範例中,請注意,每個命令旗標都是個別的命令旗標元素。

<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>