Ответ 1
ОК, поэтому я наконец нашел решение этой проблемы, есть несколько вещей, которые вам нужно сделать...
ШАГ 1:
Нам нужно указать, что VSPackage должен "автоматически загружаться", мы делаем это так, чтобы код выполнялся при отображении ContextMenu, поскольку обычно VSPackage не инициализировался до того, как пользовательский интерфейс был показан (т.е. пункт меню был нажат). Для этого добавим атрибут класса Package, например:
[ProvideAutoLoad("{f1536ef8-92ec-443c-9ed7-fdadf150da82}")]
public sealed class MyFirstPackage : Package
Вы можете задаться вопросом, что это за значение GUID, ну и в этом случае он представляет константу UICONTEXT_SolutionExists
, что означает, что пакет будет автоматически загружаться, когда решение будет существовать (поэтому, когда мы создаем новый или загружаем один). Я получил эту информацию здесь, так как вы могли бы сказать, что есть количество разных VSConstants, которые могут быть использованы.
Вот еще несколько ресурсов, которые перечисляют другие значения GUID, которые можно использовать:
ШАГ 2:
Теперь, когда код BeforeQueryStatus
выполняется в правильном месте, все еще запутанно, почему код ничего не меняет (в моем вопросе я пытаюсь изменить Text
). Ну, ответ заключается в том, что нам нужно предоставить разрешение на пакет для этого (по крайней мере, так, как я его вижу).
Для этого мы должны отредактировать файл .vsct
. Внутри мы можем найти элемент Buttons
, внутри которого должен быть наш ContextMenu Button
. По умолчанию есть несколько комментариев, в которых упоминается использование CommandFlag
node - это то, что мы хотим.
Чтобы дать разрешение нашему пакету на изменение Text
, мы должны добавить следующий node:
<CommandFlag>TextChanges</CommandFlag>
Теперь, если мы запустим VSPackage, все должно работать как ожидалось!
Если вы хотите разрешить изменение Visibility
элемента меню (это была моя первоначальная цель), вы можете использовать следующие CommandFlag
:
<CommandFlag>DynamicVisibility</CommandFlag>
Здесь присутствует полный список флагов команд с описанием того, что они делают.