2013-11-25 1 views
2

Я пишу C# addin для VS 2012. Я хочу добавить пункт меню в меню инструментов. Я хочу, чтобы этот пункт меню был отключен, когда Studio запускается и включается или отключается в зависимости от того, загружен ли проект/проект или нет.Надстройка Visual Studio. Как отключить пункт меню

Я использовал это, обрабатывая метод QueryStatus и устанавливая (или не устанавливая) статус на vsCommandStatus.vsCommandStatusEnabled, когда это необходимо. Проблема в том, что QueryStatus по какой-то причине больше не вызывается, пока я не нажму на меню «Инструменты», и поэтому я не могу отключить свой пункт меню. Может ли кто-нибудь помочь?

Я подключаюсь к моему надстройке путем обработки OnConnection

if(connectMode == ext_ConnectMode.ext_cm_UISetup) 
{ 
........ 
} 

и мой надстройку XML выглядит

<LoadBehavior>1</LoadBehavior> 
<CommandPreload>1</CommandPreload> 
<CommandLineSafe>0</CommandLineSafe> 

ответ

0

Вот аналогичная проблема с UISetup: Social.MSDN: Visual Studio no longer sends ext_cm_UISetup

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

Пока ваша надстройка не загружена, вы не можете управлять своими пунктами меню throuhg QueryStatus.

О UISetup на MZ-Tools HOWTO: Controlling the state of command in a Visual Studio add-in

Для этого вида надстроек с постоянным пользовательским интерфейсом, так как вы будет хотеть то же состояние для команды, независимо от того, загружен надстройки или нет , вы должны убедиться, что логика ваших параметров ContextUIGUIDs/vsCommandDisabledFlagsValue в вызове AddNamedCommand и логика вашего метода QueryStatus совпадают.

Так что я думаю, вы должны использовать не постоянные кнопки:

if(connectMode == ext_ConnectMode.ext_cm_AfterStartup || connectMode == ext_ConnectMode.ext_cm_Startup) 
{ 
    ... 
} 

или вы можете установить UIContext правильно. Статус запроса не должен вызываться, пока надстройка не загружена, он может быть исправлен.

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

Это решение может привести к тому, что вы оставите несколько мусорных кнопок в особых случаях после удаления Add-In. Я не могу найти решение для их очистки. Но их можно удалить вручную навсегда.

0

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