VS2005 AddIn и проблемы с контекстным меню Code View
От: deadsy Россия  
Дата: 02.02.07 13:18
Оценка:
Есть задача написания AddIn'а для студи, который сделает в контектном меню CodeView отдельный пунктик с подменю, а пункты этого подменю можно было бы делать невидимыми в зависимости от различных ситуаций.

В начале всё просто.
Ищем CodeView меню:

_CommandBars cmdBars = (_CommandBars)_applicationObject.CommandBars;
CommandBar cmdBarCodeWindow = cmdBars["Code Window"];


Создаём подменю с именем 'MySubmenu':
CommandBar cmdBarAddonMenuBar = (CommandBar)commands.AddCommandBar(
   "MySubmenu", vsCommandBarType.vsCommandBarTypeMenu, cmdBarCodeWindow, 1);
cmdBarAddonMenuBar.Enabled = true;


Далее делаются комманды через AddNamedCommand2() и добавляются контролы в моё подменю.
Контроллы добавляются таким кодом:
CommandBarButton btnDoSomth = (CommandBarButton)command.AddControl(cmdBarAddonMenuBar, 1);


И это всё при вызове OnConnect c параметром UISetup.

Далее пишется обработчик QueryStatus, и тут встречается трабл, даже если
ставить команде статус vsCommandStatus.vsCommandStatusInvisible или комбинащию
(vsCommandStatus)(vsCommandStatus.vsCommandStatusUnsupported | vsCommandStatus.vsCommandStatusInvisible)
пункт подменю пропадать не будет, он будет просто сереньким.

Есть мысль, что таким образом его спрятать нельзя, а можно спрятать используя проперти Visible
у объекта CommandBarButton, но тут есть загвоздка.
Когда мы только-только создали контроллы для команд, то они являются child'ами нашего
cmdBarAddonMenuBar'а (это легко проверить хотя-бы посмотрев значение cmdBarAddonMenuBar.Controls.Count).
А теперь перезапустим студию и у нас OnConnect вызовется с параметром Startup,
теперь если найти наш CommandBar с именем MySubmenu и посмотреть сколько у него child'ов
окажется что их 0, хотя само контекстное меню аддона работает норамльно и команды запускаются.
Отсюда вопрос, как найти объекты CommandBarButton принадлежащие командам?
или как по другому сделать пункты подменю невидимыми?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.