Visual Studio добавить в контекстное меню не получает события - PullRequest
0 голосов
/ 11 февраля 2012

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

Это абсолютно стандартная надстройка с этим кодом:

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
    applicationObject = (DTE2)application;
    addInInstance = (AddIn)addInInst;

    var commandBars = ((CommandBars)applicationObject.CommandBars)["Code Window"];
    var popup = commandBars.Controls.Add(MsoControlType.msoControlButton,
                System.Reflection.Missing.Value, 
                System.Reflection.Missing.Value, 1, true);
    popup.Caption = "View graph";
    var commandBarEvents = (CommandBarEvents)(applicationObject.Events.CommandBarEvents[popup]);
    commandBarEvents.Click += ViewGraphClick;
}

private void ViewGraphClick(object commandbarcontrol, ref bool handled, ref bool canceldefault)
{
    var selection = (TextSelection)applicationObject.ActiveDocument.Selection;
    selection.Insert("Hello, world!");
    handled = true;
}

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

Насколько я понимаю, этот метод вызывается только один раз. Есть идеи о том, что я здесь делаю не так?

Обновление: Я пытался вставить тот же код инициализации в OnStartup. Результат тот же. Я также пытался сделать, как показано в примере здесь , но мой OnConnection вызывается только один раз с connectMode, установленным на Startup.

Обновление 2 Я перепробовал как можно больше комбинаций, перемещая всю инициализацию вокруг. В конце концов, я сдался и начал использовать другой пример, который использует команды вместо простых контекстных меню. Это, вероятно, лучшее решение в долгосрочной перспективе, но мне все еще интересно, почему оригинальный код не работал.

1 Ответ

2 голосов
/ 05 октября 2012

Сделайте эти переменные глобальными:

    CommandBarEvents commandBarEvents;
    CommandBar commandBars;
    CommandBarControl popup;

Если вы создаете эти объекты в OnConnection, они удаляются, как только код выходит из области видимости.

...