46 votes

Plug-in Visual Studio 2010 - Ajout d'un menu contextuel à l'explorateur de solutions

Je souhaite ajouter une nouvelle option dans le menu contextuel de l'explorateur de solutions de Visual Studio 2010 pour un type de fichier spécifique. Ainsi, par exemple, un clic droit sur un fichier * .cs affichera le menu contextuel existant plus "ma nouvelle option".

Je me demande à quoi ressemblerait le code; et aimerions avoir un pointeur sur une bonne référence pour le développement de plug-ins Visual Studio. Les tutoriels / références que je vois sont remarquablement horribles.

Merci!

32voto

Maslow Points 7268

Il m'a fallu environ 5 heures pour ce faire.

Il y a 2 options, Visual studio Add-in (ou partagé) vs Visual studio.

Le package est bien plus compliqué pour vous donner plus de contrôle, mais pour un menu contextuel dans l'explorateur de solutions, il n'est pas nécessaire.

Donc nouveau projet-> d'Autres Types de Projet -> Extensibilité -> Visual Studio Add-in.

Voici une promenade par le biais du Lien

Également, j'ai suivi quelques - Lien

Je vous recommande de laisser l'option pour ajouter des outils de menu jusqu'à ce que vous avez le menu de contexte de travail, ou de fournir un endroit pour mettre une boîte de dialogue paramètres (si vous n'écrivez pas un Outil-> options de la page.

Voici le code de connexion:

  _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;
        if (connectMode == ext_ConnectMode.ext_cm_UISetup)
        {
            object[] contextGUIDS = new object[] { };
            Commands2 commands = (Commands2)_applicationObject.Commands;
            string toolsMenuName = "Tools";

            //Place the command on the tools menu.
            //Find the MenuBar command bar, which is the top-level command bar holding all the main menu items:
            Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];

            //Find the Tools command bar on the MenuBar command bar:
            CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
            CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
            // get popUp command bars where commands will be registered.
            CommandBars cmdBars = (CommandBars)(_applicationObject.CommandBars);
            CommandBar vsBarItem = cmdBars["Item"]; //the pop up for clicking a project Item
            CommandBar vsBarWebItem = cmdBars["Web Item"];
            CommandBar vsBarMultiItem = cmdBars["Cross Project Multi Item"];
            CommandBar vsBarFolder = cmdBars["Folder"];
            CommandBar vsBarWebFolder = cmdBars["Web Folder"];
            CommandBar vsBarProject = cmdBars["Project"]; //the popUpMenu for right clicking a project
            CommandBar vsBarProjectNode = cmdBars["Project Node"];

            //This try/catch block can be duplicated if you wish to add multiple commands to be handled by your Add-in,
            //  just make sure you also update the QueryStatus/Exec method to include the new command names.
            try
            {
                //Add a command to the Commands collection:
                Command command = commands.AddNamedCommand2(_addInInstance, "HintPaths", "HintPaths", "Executes the command for HintPaths", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);

                //Add a control for the command to the tools menu:
                if ((command != null) && (toolsPopup != null))
                {
                    //command.AddControl(toolsPopup.CommandBar, 1);
                    command.AddControl(vsBarProject); 
                }
            }
            catch (System.ArgumentException argEx)
            {
                System.Diagnostics.Debug.Write("Exception in HintPaths:" + argEx.ToString());
                //If we are here, then the exception is probably because a command with that name
                //  already exists. If so there is no need to recreate the command and we can 
                //  safely ignore the exception.
            }
        }
    }

Ce code vérifie si l'utilisateur a sélectionné un projet, par exemple:

  private Project GetProject()
    {
        if (_applicationObject.Solution == null || _applicationObject.Solution.Projects == null || _applicationObject.Solution.Projects.Count < 1)
            return null;
        if (_applicationObject.SelectedItems.Count == 1 && _applicationObject.SelectedItems.Item(1).Project != null)
            return _applicationObject.SelectedItems.Item(1).Project;
        return null;
    }

Notez que certains noms de chaîne dans votre code correspondre et je ne suis pas sûr que ceux qu'ils sont encore tout à fait comme je viens de le faire hier.

16voto

Kenn Points 1021

J'ai constaté que la meilleure solution consistait à créer un package Visual Studio au lieu d'un complément Visual Studio. L’expérience de déploiement de vsix est tellement simple: c’est une expérience très facile. Il ne prend en charge que Visual Studio 2010, mais cela suffisait dans mon cas.

Voici le vsct résultant:

 <Commands package="guidBingfooPluginPkg">
    <Groups>
      <Group guid="guidBingfooPluginCmdSet" id="MyMenuGroup" priority="0x0600">
        <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/>
      </Group>
    </Groups>

    <Buttons>
      <Button guid="guidBingfooPluginCmdSet" id="cmdidfooLocalBox" priority="0x0100" type="Button">
        <Parent guid="guidBingfooPluginCmdSet" id="MyMenuGroup" />
        <!-- <Icon guid="guidImages" id="bmpPic1" /> -->
        <CommandFlag>DynamicVisibility</CommandFlag>
        <Strings>
          <CommandName>cmdidfooLocalBox</CommandName>
          <ButtonText>View in foo</ButtonText>
        </Strings>
      </Button>

      <Button guid="guidBingfooPluginCmdSet" id="cmdidfooTestBed" priority="0x0100" type="Button">
        <Parent guid="guidBingfooPluginCmdSet" id="MyMenuGroup" />
        <CommandFlag>DynamicVisibility</CommandFlag>
        <Strings>
          <CommandName>cmdidfooTestBed</CommandName>
          <ButtonText>View in foo on Test Beds</ButtonText>
        </Strings>
      </Button>

    </Buttons>

    <Bitmaps>
      <Bitmap guid="guidImages" href="Resources\Images_32bit.bmp" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
    </Bitmaps>
  </Commands>

  <Symbols>
    <GuidSymbol name="guidBingfooPluginPkg" value="{62c4a13c-cc61-44a0-9e47-33111bd323ce}" />

    <GuidSymbol name="guidBingfooPluginCmdSet" value="{59166210-d88c-4259-9809-418bc332b0ab}">
      <IDSymbol name="MyMenuGroup" value="0x1020" />
      <IDSymbol name="cmdidfooLocalBox" value="0x0100" />
      <IDSymbol name="cmdidfooTestBed" value="0x0101" />
    </GuidSymbol>

    <GuidSymbol name="guidImages" value="{2dff8307-a49a-4951-a236-82e047385960}" >
      <IDSymbol name="bmpPic1" value="1" />
      <IDSymbol name="bmpPic2" value="2" />
      <IDSymbol name="bmpPicSearch" value="3" />
      <IDSymbol name="bmpPicX" value="4" />
      <IDSymbol name="bmpPicArrows" value="5" />
    </GuidSymbol>
  </Symbols>
</CommandTable>
 

3voto

Markust Points 1686

Mise à JOUR:

GAX/GAT pour VS2010 également disponibles à partir de http://msdn.microsoft.com/en-us/library/ff687173

POST ORIGINAL

Bien est horrible parce que VS est vraiment complexe. À l'aide de GAX/GAT était possible, mais il n'y a pas de VS2010 Version encore. Ce que je suggère, c'est le téléchargement de certains échantillons provenant de la Galerie Visual Studio pour essayer de comprendre comment le tout fonctionne, malheureusement ce n'est pas une tâche facile.

HTH

2voto

James Wiseman Points 18347

Je me suis trouvé avoir à ajouter un élément dans l'éditeur de code menu contextuel de la fenêtre, qui s'est terminée par cmdBars["Script Context"] que je voulais spécifiquement pour les fichiers JavaScript.

Comme une technique pour trouver ce que j'ai estimé utile de partage, j'ai ajouté un nouvel élément de menu pour tous (456) commandes de menu dans visual studio avec la boucle suivante:

foreach (CommandBar cc in cmdBars)
{
    if (cc.Index >= 1 && cc.Index <= 456)
    {
        command.AddControl(cmdBars[cc.NameLocal]);
    }
}

J'ai ensuite a l'aide d'une division et de conquête technique en ajustant les limites de la boucle:

    if (cc.Index >= 1 && cc.Index <= 256)
    ...
    if (cc.Index >= 1 && cc.Index <= 128)
    ...
    if (cc.Index >= 64 && cc.Index <= 128)
    ...etc...

Jusqu'à ce que j'ai finalement trouvé ce que je cherchais.

(La question connexe de ce qui est à Visual Studio 2010 Plug-in - Ajout d'un menu contextuel de la Fenêtre de l'Éditeur)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X