2010-10-05 3 views
3

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

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

Что я использовал: Я использовал эту статью в качестве руководства. 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 сообщает мне, что это имя меню, если я сделаю правый щелчок на нашем проекте Team 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); 
    } 

CommandBar "родитель" дает мне довольно некоторые исключения, если я повнимательнее взглянуть на него:

accChildCount = 'parent.accChildCount' бросил исключение типа «Microsoft.VisualStudio.PlatformUI.Automation.DeprecatedException»

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

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

+0

Я бы не стал слишком беспокоиться об устаревших Исключениях; они, вероятно, только там, потому что MS не хочет, чтобы вы использовали устаревшую версию интерфейса. Вероятно, они немного изменили интерфейс с момента его первого выпуска и не смогли удалить свойства по соображениям совместимости. – takrl

+0

Каков ваш метод QueryStatus? Этот метод определяет, скрыта или видима команда, и я замечаю, что статья, на которую вы указываете, не дает примера ее реализации. –

+1

У меня почти такой же код, за исключением того, что я добавляю свои пользовательские команды внутри метода «IDTExtensibility2.OnStartupComplete». А внутри метода "IDTExtensibility2.OnConnection", я использую "ext_ConnectMode.ext_cm_AfterStartup" вместо "ext_ConnectMode.ext_cm_UISetup": если (ConnectMode == ext_ConnectMode.ext_cm_AfterStartup) this.OnStartupComplete (ссылка на заказ); –

ответ

3

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

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

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 - это новый объект [], который был объявлен непосредственно перед вызовом метода для удерживания указателя для команды, это не так важно, просто добавьте его, важны следующие параметры , первая говорит визуальной студии, если команда видна и включена: (int) vsCommandStatus.vsCommandStatusSupported + (int) vsCommandStatus.vsCommandStatusEnabled, а затем дать некоторый намек на то, как должна выглядеть ваша команда (кнопка в нашем случае).

Это только начальная точка, Plaese обратитесь к этой статье: HOWTO: Create a context menu using a Visual Studio commandbar popup from an add-in

Удачи!

Смежные вопросы