Partager via


Mise à disposition des commandes

Lorsque plusieurs VSPackages sont ajoutés à Visual Studio, l’interface utilisateur peut devenir saturée avec des commandes. Vous pouvez programmer votre package pour réduire ce problème, comme suit :

  • Programmez le package afin qu’il soit chargé uniquement lorsqu’un utilisateur l’exige.

  • Programmez le package afin que ses commandes soient affichées uniquement quand elles peuvent être requises dans le contexte de l’état actuel de l’environnement de développement intégré (IDE).

Chargement différé

La façon classique d’activer le chargement différé consiste à concevoir le VSPackage afin que ses commandes soient affichées dans l’interface utilisateur, mais que le package lui-même n’est pas chargé tant qu’un utilisateur n’a pas cliqué sur l’une des commandes. Pour ce faire, dans le fichier .vsct, créez des commandes qui n’ont aucun indicateur de commande.

L’exemple suivant montre la définition d’une commande de menu à partir d’un fichier .vsct. Il s’agit de la commande générée par le modèle de package Visual Studio lorsque l’option Commande de menu dans le modèle est sélectionnée.

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

Dans l’exemple, si le groupe parent, MyMenuGroupest un enfant d’un menu de niveau supérieur tel que le menu Outils , la commande est visible sur ce menu, mais le package qui exécute la commande ne sera pas chargé tant que la commande n’est pas cliquée par un utilisateur. Toutefois, en programmation de la commande pour implémenter l’interface IOleCommandTarget , vous pouvez activer le chargement du package lorsque le menu qui contient la commande est développé pour la première fois.

Notez que le chargement retardé peut également améliorer les performances de démarrage.

Contexte actuel et visibilité des commandes

Vous pouvez programmer des commandes VSPackage pour qu’elles soient visibles ou masquées, en fonction de l’état actuel des données VSPackage ou des actions actuellement pertinentes. Vous pouvez activer VSPackage pour définir l’état de ses commandes, généralement à l’aide d’une implémentation de la QueryStatus méthode à partir de l’interface IOleCommandTarget , mais cela nécessite le chargement de VSPackage avant de pouvoir exécuter le code. Au lieu de cela, nous vous recommandons d’activer l’IDE pour gérer la visibilité des commandes sans charger le package. Pour ce faire, dans le fichier .vsct, associez des commandes à un ou plusieurs contextes d’interface utilisateur spéciaux. Ces contextes d’interface utilisateur sont identifiés par un GUID appelé GUID de contexte de commande.

Visual Studio surveille les modifications résultant d’actions utilisateur telles que le chargement d’un projet ou la modification vers la génération. À mesure que des modifications se produisent, l’apparence de l’IDE est automatiquement modifiée. Le tableau suivant présente quatre contextes majeurs de modification de l’IDE que Visual Studio surveille.

Type de contexte Description
Type de projet actif Pour la plupart des types de projet, cette GUID valeur est identique au GUID du VSPackage qui implémente le projet. Toutefois, les projets Visual C++ utilisent le type GUID de projet comme valeur.
Fenêtre active En règle générale, il s’agit de la dernière fenêtre de document active qui établit le contexte actuel de l’interface utilisateur pour les liaisons de clés. Toutefois, il peut également s’agir d’une fenêtre d’outil qui a une table de liaison de clé qui ressemble au navigateur Web interne. Pour les fenêtres de document à plusieurs onglets, telles que l’éditeur HTML, chaque onglet a un contexte GUIDde commande différent.
Service de langage actif Service de langue associé au fichier actuellement affiché dans un éditeur de texte.
Fenêtre Outil active Fenêtre d’outil ouverte et avec focus.

Une cinquième zone de contexte majeure est l’état de l’interface utilisateur de l’IDE. Les contextes d’interface utilisateur sont identifiés par les contextes GUIDde commande actifs, comme suit :

Ces GUID sont marqués comme actifs ou inactifs, selon l’état actuel de l’IDE. Plusieurs contextes d’interface utilisateur peuvent être actifs en même temps.

Masquer et afficher des commandes en fonction du contexte

Vous pouvez afficher ou masquer une commande de package dans l’IDE sans charger le package lui-même. Pour ce faire, définissez la commande dans le fichier .vsct du package à l’aide des DefaultDisabledindicateurs de commande , DefaultInvisibleet DynamicVisibility ajoutez un ou plusieurs éléments VisibilityItem à la section VisibilityConstraints . Lorsqu’un contexte GUID de commande spécifié devient actif, la commande s’affiche sans charger le package.

GUID de contexte personnalisé

Si un GUID de contexte de commande approprié n’est pas déjà défini, vous pouvez en définir un dans votre VSPackage, puis le programmer pour qu’il soit actif ou inactif si nécessaire pour contrôler la visibilité de vos commandes. Utilisez le SVsShellMonitorSelection service pour :

  • Inscrire des GUID de contexte (en appelant la GetCmdUIContextCookie méthode).

  • Obtenez l’état d’un contexte GUID (en appelant la IsCmdUIContextActive méthode).

  • Activez et désactivez le contexte GUID(en appelant la SetCmdUIContext méthode).

    Attention

    Assurez-vous que votre VSPackage n’affecte pas l’état d’un GUID de contexte existant, car d’autres VSPackages peuvent dépendre d’eux.

Exemple

L’exemple suivant d’une commande VSPackage illustre la visibilité dynamique d’une commande gérée par des contextes de commande sans charger vsPackage.

La commande est définie pour être activée et affichée chaque fois qu’une solution existe ; autrement dit, chaque fois que l’un des GUID de contexte de commande suivants est actif :

Dans l’exemple, notez que chaque indicateur de commande est un élément d’indicateur de commande distinct.

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

Notez également que chaque contexte d’interface utilisateur doit être donné dans un élément distinct VisibilityItem , comme suit.

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