2009-07-28 2 views
0

Я использую этот код, чтобы добавить элемент в окне кода правой кнопкой мыши меню:VS2008 Addin добавить в меню

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

    object[] contextGUIDS = new object[] { }; 
    Command codeWindowCommand = null; 
    CommandBarControl codeWindowButton; 
    CommandBar codeCommandBar; 
    CommandBars commandBars; 

    try 
    { 
     codeWindowCommand = _applicationObject.Commands.Item(
      _addInInstance.ProgID + "." + CODEWINDOW_COMMAND_NAME, 0); 
    } 
    catch 
    { 
    } 

    if (codeWindowCommand == null) 
    { 
     codeWindowCommand = _applicationObject.Commands.AddNamedCommand(
      _addInInstance, 
      CODEWINDOW_COMMAND_NAME, 
      CODEWINDOW_COMMAND_NAME, 
      "Pastebin selected code", 
      true, 
      18, 
      ref contextGUIDS, 
      (int)vsCommandStatus.vsCommandStatusSupported + 
      (int)vsCommandStatus.vsCommandStatusEnabled); 
    } 

    commandBars = (CommandBars)_applicationObject.CommandBars; 

    codeCommandBar = commandBars["Code Window"]; 

    codeWindowButton = (CommandBarControl)codeWindowCommand.AddControl(
     codeCommandBar, codeCommandBar.Controls.Count + 1); 
    codeWindowButton.Caption = "Text for button"; 
    codeWindowButton.TooltipText = "Tooltip for button"; 
} 

и надстройка устанавливается в автозагрузку. Однако каждый раз при запуске VS2008 он добавляет еще одну кнопку в меню, пока я полностью не удалю добавление. Кто-нибудь знает, как я это исправить?

Я бы, например, обернул команду Command.AddControl() и позже в a, если это выполняется только в том случае, если кнопка еще не существует, но я не могу найти способ проверить это в API?

ответ

1

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

Однако, я не являюсь экспертом по этой теме, так вот некоторые ссылки, которые будет помощь вам:

HOWTO: Use correctly the OnConnection method of a Visual Studio add-in

HOWTO: Adding buttons, commandbars and toolbars to Visual Studio .NET from an add-in

HOWTO: Controlling the state of command in a Visual Studio add-in

Те несколько слишком чтобы просто подвести итоги (по крайней мере, мне кажется это так), но у них есть необходимая информация.

Кроме того, здесь приведен список статей по написанию расширений VS, которые, вероятно, будет очень полезно: http://www.mztools.com/resources_vsnet_addins.aspx

HTH.


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

+0

Я буду делать короткое исправление, а затем углубиться в эту информацию, когда получаю время. Большинство из того, что я мог найти, всегда делали это на этом ужасном языке, известном как vb.net, который был не слишком полезен, поэтому спасибо. – ewanm89

+0

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

+0

Спасибо, эти ссылки были большой помощью вместе с этим: http://www.mztools.com/articles/2006/MZ2006014.aspx – ewanm89

0

Я не написал надстройку для VS.NET 2008 и раньше, но, видя, что вы имеете в наличии на вашем методе:

Проверьте ext_cm_UISetup?

if(connectMode == ext_ConnectMode.ext_cm_UISetup) 
    { 

также, в вашей Ьге блоке вы должны быть в состоянии использовать ResourceManager ...

ResourceManager resourceManager = new  
      ResourceManager("MyAddin1.CommandBar", 
      Assembly.GetExecutingAssembly()); 
     CultureInfo cultureInfo = new 
      System.Globalization.CultureInfo 
      (_applicationObject.LocaleID); 
     string resourceName = String.Concat(cultureInfo. 
      TwoLetterISOLanguageName, "Tools"); 
     toolsMenuName = resourceManager.GetString(resourceName); 

и удобную диаграмму, которая может помочь в будущем.

http://msdn.microsoft.com/en-us/library/za2b25t3.aspx

+0

Я пробовал эту функцию connectMode всеми способами, предложенными здесь, и все они в конечном итоге означают, что я вообще не получайте элемент меню ... – ewanm89

+0

Я все еще пытаюсь понять, что код ResourceManager даже пытается сделать, и как он относится к моим именам переменных. – ewanm89

0

Попробуйте изменить:

codeWindowCommand = _applicationObject.Commands.Item(_addInInstance.ProgID + "." + CODEWINDOW_COMMAND_NAME, 0); 

... чтобы:

codeWindowCommand = _applicationObject.Commands.Item(_addInInstance.ProgID + "." + CODEWINDOW_COMMAND_NAME, -1); 

...и оберните все это в:

#if DEBUG 
if (connectMode == ext_ConnectMode.ext_cm_UISetup) 
#else 
if (connectMode == ext_ConnectMode.ext_cm_Startup || connectMode == ext_ConnectMode.ext_cm_AfterStartup) 
#endif 
{ 
    //add-in startup code goes here 
} 
+0

Я уже пробовал -1, поскольку он говорит, что это необязательно. – ewanm89

+0

Хорошо, и вы добавили проверку connectMode одновременно? OnConnection можно вызывать несколько раз в разных контекстах, а также ведет себя по-разному в зависимости от параметров LoadBehaviour/CommandPreload в файле .addin ... – KristoferA

+0

Я пробовал эту функцию connectMode во всех предложенных здесь способах, и все они заканчиваются, потому что я не получаю никакого пункта меню на всех ... Поведение загрузки начинается с запуска VS2008. – ewanm89