Modifier le texte d’une commande de menu

Les étapes suivantes montrent comment modifier l’étiquette de texte d’une commande de menu à l’aide du IMenuCommandService service.

Modification d’une étiquette de commande de menu avec IMenuCommandService

  1. Créez un projet VSIX nommé MenuText avec une commande de menu nommée ChangeMenuText. Pour plus d’informations, consultez Créer une extension avec une commande de menu.

  2. Dans le fichier .vsct , ajoutez l’indicateur TextChanges à votre commande de menu, comme illustré dans l’exemple suivant.

    <Button guid="guidChangeMenuTextPackageCmdSet" id="ChangeMenuTextId" priority="0x0100" type="Button">
        <Parent guid="guidChangeMenuTextPackageCmdSet" id="MyMenuGroup" />
        <Icon guid="guidImages" id="bmpPic1" />
        <CommandFlag>TextChanges</CommandFlag>
        <Strings>
            <ButtonText>Invoke ChangeMenuText</ButtonText>
        </Strings>
    </Button>
    
  3. Dans le fichier ChangeMenuText.cs , créez un gestionnaire d’événements qui sera appelé avant l’affichage de la commande de menu.

    private void OnBeforeQueryStatus(object sender, EventArgs e)
    {
        var myCommand = sender as OleMenuCommand;
        if (null != myCommand)
        {
            myCommand.Text = "New Text";
        }
    }
    

    Vous pouvez également mettre à jour l’état de la commande de menu dans cette méthode en modifiant les propriétés et Enabled les VisibleCheckedpropriétés de l’objetOleMenuCommand.

  4. Dans le constructeur ChangeMenuText, remplacez l’initialisation de commande d’origine et le code de placement par du code qui crée un OleMenuCommand (plutôt qu’un MenuCommand) qui représente la commande de menu, ajoute le BeforeQueryStatus gestionnaire d’événements et donne la commande de menu au service de commandes de menu.

    Voici ce à quoi il doit ressembler :

    private ChangeMenuText(AsyncPackage package, OleMenuCommandService commandService)
    {
        this.package = package ?? throw new ArgumentNullException(nameof(package));
        commandService = commandService ?? throw new ArgumentNullException(nameof(commandService));
    
        var menuCommandID = new CommandID(CommandSet, CommandId);
        var menuItem = new OleMenuCommand(this.Execute, menuCommandID);
        menuItem.BeforeQueryStatus += new EventHandler(OnBeforeQueryStatus);
        commandService.AddCommand(menuItem);
    }
    
  5. Générez le projet et commencez le débogage. L’instance expérimentale de Visual Studio s’affiche.

  6. Dans le menu Outils , vous devez voir une commande nommée Invoke ChangeMenuText.

  7. Cliquez sur la commande. Vous devriez voir la boîte de message annonçant que MenuItemCallback a été appelé. Lorsque vous ignorez la boîte de message, vous devez voir que le nom de la commande dans le menu Outils est désormais Nouveau texte.