Надстройка VS2010, добавление команды в контекстное меню? - PullRequest
3 голосов
/ 05 октября 2010

Я знаю, что уже есть некоторые темы по этому поводу, но я просто не буду работать для меня.

Что я хочу: мне нужна новая запись в контекстном меню проводника управления источниками Visual Studio.Для этого я запустил новый проект надстройки.

Что я использовал: я использовал эту статью в качестве руководства.http://blogs.msdn.com/b/team_foundation/archive/2010/06/24/extending-work-item-tracking-context-menus.aspx

Что не работает: я не получаю никаких исключений, меню просто не будет отображаться, независимо от того, где я его добавлю.

Некоторые фрагменты кода:

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
if(connectMode == ext_ConnectMode.ext_cm_UISetup)
{
   AddCommandToContextMenu(
                         "Team Project", // context menu Name
                         "ClearQuery", // menu reference name
                         "Clear", // display name
                         47, // command icon
                         1);    // command placement, 1= first item on top
                }
}

Я использую название меню «Team Project» для тестирования.VSIPLogging говорит мне, что это название меню, если я сделаю щелчок правой кнопкой мыши на нашем командном проекте TFS.Я также безуспешно пробовал другие меню.

Вот функции AddCommandToContextMenu:

private void AddCommandToContextMenu(string menuName, string commandName, string commandText, int iconId, int position)
    {

                    CommandBar contextMenu = ((CommandBars)_applicationObject.CommandBars)[menuName];

                    AddCommand(contextMenu, commandName, commandText, iconId, position);
    }



private void AddCommand(CommandBar parent, string commandName, string commandText, int iconId, int position)

    {
                     Commands2 commands = (Commands2)_applicationObject.Commands;
                    //create the command
                    Command newCommand = commands.AddNamedCommand2(_addInInstance, commandName, commandText, commandText, true, iconId);
                    // add it to parent menu
                    newCommand.AddControl(parent, position);
    }

Панель команд "parent" дает мне довольно много исключений, если я присмотрюсь к ней:

accChildCount = 'parent.accChildCount' вызвал исключение типа 'Microsoft.VisualStudio.PlatformUI.Automation.DeprecatedException'

То же самое для каждого другого значения "acc".

Теперь я действительно не знаю, что я сделал неправильно или что еще я мог попытаться сделать эту работу.Все, что я хочу сделать, это иметь пункт контекстного меню в проводнике управления исходным кодом, который должен вызывать из командной строки электроинструмента exe для вызова его функции «отменить неизмененные».

1 Ответ

3 голосов
/ 15 декабря 2011

Я почти уверен, что всплывающие окна в Visual Studio были типа CommnadBarPopup. Другая вещь, в которой я почти уверен, заключается в том, что вам нужно сделать ваши команды / элементы управления глобальными, чтобы на них сохранялась ссылка, иначе GC их убьет.

Вам необходимо убедиться, что имя команды в AddCommand не содержит точек, а в функциях Query / Exec - например ::

.
newCommand = commands.AddNamedCommand2(_addInInstance, commandName, commandText, commandText, true, iconId, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled,(int)vsCommandStyle.vsCommandStylePictAndText,vsCommandControlType.vsCommandControlTypeButton);

Несколько вещей, на которые стоит обратить внимание:

  1. newCommand не является локальной переменной, как в вашем коде, он превращается в глобальную переменную, чтобы поддерживать ее работу (во всяком случае, это не ваш случай, возможно, если бы это было проблемой - вы бы увидели это в первый раз, а затем оно исчезнет).
  2. Вы опускаете параметры, ref ContextGUIDS здесь - это новый объект [], который был объявлен непосредственно перед вызовом метода для хранения guid для команды, это не так важно, просто добавьте его, важны следующие параметры первый сообщает Visual Studio, если команда видима и включена: (int) vsCommandStatus.vsCommandStatusSupported + (int) vsCommandStatus.vsCommandStatusEnabled , а следующие дают некоторую подсказку о том, что ваша команда должен выглядеть (кнопка в нашем случае).

Это всего лишь отправная точка, пожалуйста, обратитесь к этой статье: HOWTO: создать контекстное меню, используя всплывающую панель команд Visual Studio из надстройки

Удачи!

...