Visual Studio に複数の VSPackage を追加すると、ユーザー インターフェイス (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 を有効にしてコマンドの状態を設定することができます。通常は、QueryStatus インターフェイスのIOleCommandTarget メソッドの実装を使用しますが、コードを実行する前に VSPackage を読み込む必要があります。 代わりに、IDE でパッケージを読み込まずにコマンドの可視性を管理できるようにすることをお勧めします。 これを行うには、.vsct ファイルで、コマンドを 1 つ以上の特別な UI コンテキストに関連付けます。 これらの UI コンテキストは、 コマンド コンテキスト GUID と呼ばれる GUID によって識別されます。
Visual Studio では、プロジェクトの読み込みや編集からビルドへの移動などのユーザー アクションによって発生する変更を監視します。 変更が行われると、IDE の外観が自動的に変更されます。 次の表は、Visual Studio が監視する IDE 変更の 4 つの主要なコンテキストを示しています。
| コンテキストの種類 | Description |
|---|---|
| アクティブなプロジェクトの種類 | ほとんどのプロジェクトの種類では、この GUID 値は、プロジェクトを実装する VSPackage の GUID と同じです。 ただし、Visual C++ プロジェクトでは、値としてプロジェクトの種類 GUID が使用されます。 |
| アクティブ ウィンドウ | 通常、これは、キー バインドの現在の UI コンテキストを確立する最後のアクティブなドキュメント ウィンドウです。 ただし、内部 Web ブラウザーに似たキー バインド テーブルがあるツール ウィンドウの場合もあります。 HTML エディターなどの複数タブのドキュメント ウィンドウでは、すべてのタブに異なるコマンド コンテキスト GUIDがあります。 |
| アクティブ・ランゲージ・サービス | 現在テキスト エディターに表示されているファイルに関連付けられている言語サービス。 |
| アクティブなツール ウィンドウ | ツール ウィンドウが開き、フォーカスが設定されています。 |
5 番目の主要なコンテキスト領域は、IDE の UI 状態です。 UI コンテキストは、次のように、アクティブなコマンド コンテキスト GUIDによって識別されます。
これらの GUID は、IDE の現在の状態に応じてアクティブまたは非アクティブとしてマークされます。 複数の UI コンテキストを同時にアクティブにすることができます。
コンテキストに基づいてコマンドを表示および非表示にする
パッケージ自体を読み込まずに、IDE でパッケージ コマンドを表示または非表示にすることができます。 これを行うには、DefaultDisabled、DefaultInvisible、およびDynamicVisibilityコマンド フラグを使用し、VisibilityConstraints セクションに 1 つ以上の VisibilityItem 要素を追加して、パッケージの .vsct ファイルでコマンドを定義します。 指定したコマンド コンテキスト GUID がアクティブになると、パッケージを読み込まずにコマンドが表示されます。
カスタム コンテキスト GUID
適切なコマンド コンテキスト GUID がまだ定義されていない場合は、VSPackage で定義し、コマンドの可視性を制御するために必要に応じてアクティブまたは非アクティブにするようにプログラムできます。 SVsShellMonitorSelection サービスを使用して、次の手順を実行します。
コンテキスト GUID を登録します ( GetCmdUIContextCookie メソッドを呼び出すことによって)。
(
GUIDメソッドを呼び出すことによって) コンテキスト IsCmdUIContextActiveの状態を取得します。コンテキスト
GUIDのオンとオフを切り替えます ( SetCmdUIContext メソッドを呼び出します)。注意事項
他の VSPackage はそれらに依存する可能性があるため、VSPackage が既存のコンテキスト GUID の状態に影響しないことを確認します。
Example
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>