次の方法で共有


コマンドを使用可能にする

複数の VSPackage が Visual Studio に追加されると、ユーザー インターフェイス (UI) がコマンドでいっぱいになることがあります。 この問題の軽減には、パッケージを次のようにプログラミングすると役立ちます。

  • ユーザーが要求したときにのみ読み込まれるようにパッケージをプログラミングします。

  • 統合開発環境 (IDE) の現在の状態のコンテキストで必要になったときにのみコマンドが表示されるようにパッケージをプログラミングします。

遅延読み込み

遅延読み込みを有効にするには、一般に、UI にコマンドが表示されるが、ユーザーがいずれかのコマンドをクリックするまでパッケージ自体は読み込まれないように VSPackage を設計します。 これを行うには、.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 ファイルで、コマンドを 1 つ以上の特別な UI コンテキストに関連付けます。 これらの UI コンテキストは、"コマンド コンテキスト GUID" と呼ばれる GUID で識別されます。

Visual Studio では、プロジェクトの読み込みや、編集からビルドへの移行などのユーザー アクションによって生じた変更を監視します。 変更が生じると、IDE の表示が自動的に変更されます。 次の表に、Visual Studio で監視される IDE の変更の 4 つの主要コンテキストを示します。

コンテキストの種類 説明
アクティブなプロジェクトの種類 ほとんどの種類のプロジェクトで、この GUID 値は、プロジェクトを実装する VSPackage の GUID と同じになります。 ただし、Visual C++ プロジェクトでは、GUID のプロジェクトの種類を値として使用します。
アクティブ ウィンドウ 通常、これは、キー バインド用に現在の UI コンテキストを確立する最後のアクティブなドキュメント ウィンドウです。 ただし、内部 Web ブラウザーに類似したキー バインド テーブルを持つツール ウィンドウになることもあります。 HTML エディターなどの複数タブのドキュメント ウィンドウでは、すべてのタブでコマンド コンテキスト GUID が異なっています。
アクティブな言語サービス テキスト エディターで現在表示されているファイルに関連付けられている言語サービス。
アクティブなツール ウィンドウ 開いており、フォーカスがあるツール ウィンドウ。

5 番目の主要コンテキスト領域は、IDE の UI 状態です。 UI コンテキストは、次のように、アクティブなコマンド コンテキスト GUID で識別されます。

これらの GUID は、IDE の現在の状態に応じて、アクティブまたは非アクティブとしてマークされます。 複数の UI コンテキストを同時にアクティブにすることができます。

コンテキストに基づいてコマンドの表示と非表示を切り替える

パッケージ自体を読み込まずに、IDE でのパッケージ コマンドの表示と非表示を切り替えることができます。 これを行うには、DefaultDisabledDefaultInvisibleDynamicVisibility コマンド フラグを使用し、1 つ以上の VisibilityItem 要素を VisibilityConstraints セクションに追加して、パッケージの .vsct ファイルでコマンドを定義します。 指定されたコマンド コンテキスト GUID がアクティブになると、パッケージを読み込まずにコマンドが表示されます。

カスタム コンテキスト GUID

適切なコマンド コンテキスト GUID がまだ定義されていない場合は、VSPackage でコマンド コンテキスト GUID を定義してから、必要に応じてアクティブまたは非アクティブになるようにプログラミングしてコマンドの表示を制御できます。 SVsShellMonitorSelection サービスを使用して、次の操作を行います。

  • (GetCmdUIContextCookie メソッドを呼び出して) コンテキスト GUID を登録します。

  • (IsCmdUIContextActive メソッドを呼び出して) コンテキスト GUID の状態を取得します。

  • (SetCmdUIContext メソッドを呼び出して) コンテキスト GUID をオンまたはオフにします。

    注意

    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>