Элемент меню, управляемый состоянием, в расширении Visual Studio 2012

Я пишу расширение Visual Studio 2012, которое определяет несколько подменю для перехода в два существующих контекстных меню Visual Studio. Элементы подменю работают правильно, за исключением одного:

Пока не будет нажат первый элемент меню в моем пакете, состояние каждого элемента меню является его состоянием по умолчанию в зависимости от его определения в файле VSCT. Это прекрасно работает для пунктов меню, которые всегда включены, но некоторые пункты меню должны быть включены или отключены в зависимости от определенных изменяющихся условий. После того, как пакет размещен, их состояния устанавливаются правильно, но как я могу правильно установить состояния до того, как будет нажат первый элемент?

В моем решении нет состояния по умолчанию, которое работает. Условия могут быть истинными или ложными при первом появлении меню.

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


person Gil    schedule 26.01.2013    source источник
comment
В каком контексте применяются эти пункты меню? Они для текстового редактора, окон инструментов...?   -  person Jason Malinowski    schedule 27.01.2013
comment
Они идут в контекстных меню редакторов кода и xaml.   -  person Gil    schedule 28.01.2013


Ответы (1)


Наконец, я нашел ответ на свой вопрос в MSDN в статье под названием Как: Автозагрузка Пакет VSP. Хитрость заключается в том, чтобы установить атрибут ProvideAutoLoadAttribute для класса пакета, созданного для проекта. Вот декларация одного из проектов, над которым я работаю:

[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[ProvideMenuResource("Menus.ctmenu", 1)]
[ProvideAutoLoad("{f1536ef8-92ec-443c-9ed7-fdadf150da82}")]
[Guid(GuidList.guidXamlHelpmeetPkgString)]
public sealed class XamlHelpmeetPackage : Package
{ ...

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

person Gil    schedule 04.02.2013
comment
Да, я знаю, что слишком поздно возвращаюсь к этому, но обычно мы предпочитаем избегать пакетов AutoLoad, поскольку, если все это делают, ваш VS загружается вечно. Поскольку вы упомянули, что это было с текстовым редактором, обычно лучшим подходом является запуск при открытии представления, а затем вызов IVsTextView.AddCommandFilter. Если это слишком сложно, проще зарегистрировать ITextViewCreationListener, а после создания XAML-файла загрузить пакет. - person Jason Malinowski; 23.05.2013
comment
Спасибо Джейсон. Я рассмотрю возможность использования одного из этих подходов, как только вернусь к этому проекту. - person Gil; 30.06.2013