Comment : Ajoutez de façon dynamique des éléments de menu
Une commande qui est définie dans le fichier de configuration de Tableau de commande XML (.vsct) et a la balise d' DynamicItemStart spécifie une position dans un menu où les commandes créées dynamiquement sont insérées. Les commandes dynamiques sont généralement créées lorsque le VSPackage associé est démarré et peuvent être mises à jour lorsque le VSPackage est ouvert.
Deux types courants de listes dynamiques sont les suivantes :
Liste récent (MRU), qui affiche généralement les noms des documents qui étaient ouverts récemment.
Liste des fenêtres, qui affiche généralement les noms des fenêtres qui sont ouverts.
la balise d' DynamicItemStart sur une définition de commande spécifie que la commande est un espace réservé jusqu'à ce que le VSPackage soit ouvert. Lorsque le VSPackage est ouvert, l'espace réservé est remplacé par 0 commandes ou plus qui sont créées au moment de l'exécution par le VSPackage et ajoutées à la liste dynamique. Vous ne pouvez pas être en mesure de voir la position dans le menu où la liste dynamique s'affiche jusqu'à ce que le VSPackage soit ouvert.
Pour remplir une liste dynamique, les appels (IDE) d'environnement de développement intégré d'abord le VSPackage pour rechercher une commande qui a un ID dont les premiers caractères sont les mêmes que l'ID d'espace réservé. Lorsque l'IDE recherche une commande correspondante, elle ajoute le nom de la commande à la liste dynamique. Ensuite l'IDE incrémente l'ID et trouve une autre commande correspondante à ajouter à la liste dynamique. L'IDE continue à incrémenter l'ID et à ajouter à la liste dynamique jusqu'à ce qu'il reste encore des commandes dynamiques.
la première procédure décrit comment créer une liste des fichiers récents dynamique dans un sous-menu.
La deuxième procédure décrit comment remplir une liste dynamique à l'aide de (MPF) managed package.
Pour plus d'informations sur les fichiers de .vsct, consultez Tableau de commande Visual Studio (. fichiers de Vsct).
Pour plus d'informations sur la création d'une liste des fichiers récents, consultez le Procédure pas - à - pas : ajouter une liste derniers fichiers utilisés à un sous-menu.
créer une commande répertoire dynamique
pour créer une commande répertoire dynamique, vous devez d'abord ajouter un élément de bouton dans le fichier de .vsct. Cet élément devient un espace réservé pour la liste dans l'IDE. Implémentez la liste elle-même dans le code.
pour créer un espace réservé pour une commande répertoire dynamique
dans le fichier de .vsct, créez un sous-menu qui contient un groupe de commandes. Pour plus d'informations, consultez Comment : Créer des menus, des sous-menus, et les menus contextuels.
ce sous-menu contiendra la liste dynamique.
Dans la section d' Symbols du fichier de .vsct, localisez l'élément de GuidSymbol qui contient vos autres commandes. Ajoutez un élément d' IDSymbol pour le groupe d' MRUListGroup et l'ordre des cmdidMRUList pour l'espace réservé dynamique de liste, comme suit.
définissez un groupe, comme suit.
<Group guid="guidTopLevelMenuCmdSet" id="MRUListGroup" priority="0x100"> <Parent guid="guidTopLevelMenuCmdSet" id="SubMenu"/> </Group>
Définissez la nouvelle commande en tant qu'élément d' Button dans la section d' Buttons .
Définissez les champs d' guid et d' id à un GUID : Paire d'ID qui représente le nouvel élément. GUID : La paire d'ID inclut les valeurs d' name des éléments d' GuidSymbol et d' IDSymbol de l'étape précédente.
ce GUID : La paire d'ID est la première d'une liste de commandes dynamiques qui sont ajoutées au moment de l'exécution par le VSPackage. Chaque commande dynamique suivante a un ID qui est un plus grand que l'ID de la commande dynamique précédente.
définissez l'attribut d' type à bouton.
Une commande dynamique a le bouton de type comme toute autre commande.
Ne définissez pas d'attribut d' priority pour la commande.
Ce sous-menu contient uniquement une liste dynamique. Par conséquent, la priorité du premier élément n'a pas d'importance. Les éléments DOM ajoutés ultérieurement ont la même priorité ; l'ordre dans lequel chaque est ajoutée détermine sa position relative.
Ajoutez un élément de parent qui a guid et les attributs d' id qui correspondent à ceux du groupe créé pour le sous-menu.
ajoutez un élément de balise de commande et définissez sa valeur à DynamicItemStart.
Marque la commande comme espace réservé.
Notes
Toutes les autres balises sont ignorées.Si vous souhaitez contrôler la visibilité d'un élément dynamique, vous devez le faire de VSPackage au moment de l'exécution.
ajoutez un élément de chaînes qui contient un élément de ButtonText et un élément de CommandName et définit leurs valeurs au nom de l'espace réservé.
En général, ce texte du bouton n'est pas encore rencontré si le VSPackage peut initialiser la liste dynamique avant que le menu qui la contient est affiché.
ne spécifiez pas un élément d' icône .
Une commande dynamique ne peut pas avoir une icône associée.
L'exemple suivant illustre une définition de commande effectuée pour un espace réservé de liste des fichiers récents.
<Button guid="guidTopLevelMenuCmdSet" id="cmdidMRUList" type="Button" priority="0x0100"> <Parent guid="guidTopLevelMenuCmdSet" id="MRUListGroup" /> <CommandFlag>DynamicItemStart</CommandFlag> <Strings> <CommandName>cmdidMRUList</CommandName> <ButtonText>MRU Placeholder</ButtonText> </Strings> </Button>
implémenter la liste dynamique
Les gestionnaires d'événements managés en (MPF) charge du package pour masquer les détails de l'interface d' IOleCommandTarget et de sa méthode d' QueryStatus . Pour un VSPackage qui est écrit en utilisant le MPF pour prendre en charge une liste dynamique de commandes de menu, créez une liste d'objets d' OleMenuCommand , qui représente un élément dans la liste dynamique. Chaque objet d' OleMenuCommand a le même gestionnaire d'événements pour exécuter la commande et le même gestionnaire d'événements pour obtenir l'état de la commande.
Notes
Utilise le code de procédure suivante pour Procédure pas - à - pas : ajouter une liste derniers fichiers utilisés à un sous-menu pour illustrer comment implémenter une liste dynamique.Toutefois, le code ne crée pas un VSPackage complet.Pour obtenir un exemple complet, consultez la procédure.
pour implémenter une liste dynamique
Ajoutez l'ID à la liste des ID dans PkgCmdID.cs.
public const uint cmdidMRUList = 0x200;
dans TopLevelMenuPackage.cs ajoutez cette instruction using.
using System.Collections;
Liez l'espace réservé à une instance d' OleMenuCommand et assigner ses gestionnaires d'événements. La méthode dans l'exemple suivant est appelée à partir de la méthode d' Initialize() de package.
private void InitMRUMenu(OleMenuCommandService mcs) { InitializeMRUList(); for (int i = 0; i < this.numMRUItems; i++) { var cmdID = new CommandID( GuidList.guidTopLevelMenuCmdSet, this.baseMRUID + i); var mc = new OleMenuCommand( new EventHandler(OnMRUExec), cmdID); mc.BeforeQueryStatus += new EventHandler(OnMRUQueryStatus); mcs.AddCommand(mc); } }
les exemples dans cette procédure supposent que les variables privées suivantes sont utilisées.
private int numMRUItems = 4; private int baseMRUID = (int)PkgCmdIDList.cmdidMRUList; private ArrayList mruList;
Utilisez le gestionnaire d'événements de QueryStatus pour remplir une liste dynamique, comme indiqué dans l'exemple suivant.
private void OnMRUQueryStatus(object sender, EventArgs e) { OleMenuCommand menuCommand = sender as OleMenuCommand; if (null != menuCommand) { int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID; if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count) { menuCommand.Text = this.mruList[MRUItemIndex] as string; } } }
Implémentez le gestionnaire d'exec pour répondre à un élément de la liste est activé. L'exemple suivant met à jour la position des éléments de liste afin que le plus récent apparaît en haut.
private void OnMRUExec(object sender, EventArgs e) { var menuCommand = sender as OleMenuCommand; if (null != menuCommand) { int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID; if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count) { string selection = this.mruList[MRUItemIndex] as string; for (int i = MRUItemIndex; i > 0; i--) { this.mruList[i] = this.mruList[i - 1]; } this.mruList[0] = selection; System.Windows.Forms.MessageBox.Show( string.Format(CultureInfo.CurrentCulture, "Selected {0}", selection)); } } }
Vous pouvez également utiliser la propriété d' Text ou la propriété d' CommandID pour identifier l'élément sélectionné et répondre en conséquence.
Contrôler la visibilité des éléments de menu de menu ou person en définissant la propriété d' Visible . Le code suivant affiche un menu ou un élément de menu invisible.
var menuCommand = sender as OleMenuCommand; menuCommand.Visible = false;
Plaçant le code précédent dans le gestionnaire de QueryStatus applique le menu entier car il fournit l'argument d' sender à ce gestionnaire. Toutefois, la mise de celle-ci dans le gestionnaire d'exec affecte uniquement l'élément de menu individuels qui est exécuté.
Voir aussi
Concepts
Comment les VSPackages ajoutent des éléments de l'interface utilisateur à l'IDE
Autres ressources
commandes, menus, et barres d'outils
Tâches courantes avec des commandes, des menus, et les barres d'outils