Поделиться через


Ограничения активации на основе правил

Одной из распространенных концепций в VisualStudio.Extensibility является использование правил активации на основе контекста. Эти правила определяют условия, при которых пользователю предоставляется расширение или команда. Пример правила активации на основе контекста — VisibleWhen это свойство в конфигурации команды, которая объявляет, когда команда становится видимой.

Типы ограничений

Каждое ограничение определяется как экземпляр типа, созданного ActivationConstraint одним из ActivationConstraintметодов фабрики, например ClientContext.

Несколько ограничений активации можно объединить с помощью AndOrметодов и Not методов. Вы также можете объединить ограничения активации с помощью операторов &и !|.

Пример определения

В следующем примере свойство EnabledWhen конфигурации команд определяет, когда команда находится в состоянии включено. Метод ClientContext является одним из методов фабрики ограничений активации. Он создает ограничение активации, учитывая два аргумента, шаблон строки и регулярного выражения для сопоставления с этой строкой. Поэтому следующий код указывает, что команда включена, когда пользователь выбирает файл с одним из этих расширений.

public override CommandConfiguration CommandConfiguration => new("%My command.DisplayName%")
{
    EnabledWhen = ActivationConstraint.ClientContext(ClientContextKey.Shell.ActiveSelectionFileName, @"\.(jpg|jpeg|txt)$"),
};

Класс ClientContextKey предоставляет диапазон сведений о состоянии интегрированной среды разработки, на которые можно протестировать; для таблицы значений см . ключи контекста клиента.

В следующем примере показано, как объединить несколько ограничений:

EnabledWhen = ActivationConstraint.And(
    ActivationConstraint.SolutionState(SolutionState.Exists),
    ActivationConstraint.ClientContext(ClientContextKey.Shell.ActiveEditorFileName, @"\.(jpg|jpeg|txt)$")),

или, более кратко, с помощью & оператора:

EnabledWhen =
    ActivationConstraint.SolutionState(SolutionState.Exists) &
    ActivationConstraint.ClientContext(ClientContextKey.Shell.ActiveEditorFileName, @"\.(jpg|jpeg|txt)$")),

Свойства ограничения активации

Ограничения активации можно использовать для настройки различных функций VisualStudio.Extensibility, включая загрузку расширения, а также включенное или видимое состояние команды. Типы конфигурации содержат свойство типа ActivationConstraint, как правило, суффиксом When , который подразумевает, что что-то активируется при выполнении указанных условий.

Методы фабрики ограничений активации

В этом разделе показан список поддерживаемых в настоящее время ограничений активации. Каждая запись в списке — это метод фабрики ActivationConstraint для типа.

Срок Description
ClientContext(<key>=, <pattern>=<ClientContextKeyregex>) Значение True, если указанный ключ контекста клиента соответствует регулярному выражению. См . ключи контекста клиента.
ActiveProjectCapability(<expression>=ProjectCapability) True, когда решение имеет проект с возможностями, соответствующими предоставленному подтексту. Выражение может быть примерно таким VB | CSharp. Дополнительные сведения о возможностях проекта см. в обзоре API запросов project.
ProjectAddedItem(<pattern>=<regex>) Термин true, если файл, соответствующий шаблону, добавляется в проект в открываемом решении.
SolutionHasProjectCapability(<expression>=ProjectCapability) True, когда решение имеет проект с возможностями, соответствующими предоставленному подтексту. Выражение может быть примерно таким VB | CSharp. Дополнительные сведения о возможностях проекта см. в обзоре API запросов project.
SolutionState(<state>=SolutionState) Значение True, если состояние решения соответствует указанному значению, см . сведения о состояниях решения для списка значений.
EditorContentType(<contentType>) Значение true, если активный тип контента редактора является или наследуется от определенного типа контента.

По соображениям совместимости также поддерживаются следующие устаревшие ограничения активации:

Срок Description
ActiveProjectBuildProperty(<property>=<regex>) Термин true, если выбранный проект имеет указанное свойство сборки, а значение свойства соответствует предоставленному шаблону regex.
ActiveProjectFlavor(<guid>) True, если выбранный проект имеет вкус, соответствующий заданному идентификатору GUID типа проекта.
SolutionHasProjectBuildProperty(<property>=<regex>) Термин true, если решение имеет загруженный проект с указанным свойством сборки и значением свойства соответствует предоставленному фильтру regex.
SolutionHasProjectFlavor(<guid>) True, если решение имеет проект, который имеет вкус (агрегированный) и имеет вкус, соответствующий заданному идентификатору GUID типа проекта.
UIContext(<guid>) Значение true, если указанный контекст пользовательского интерфейса активен в экземпляре Visual Studio.

Состояния решения

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

Ограничения активации, соответствующие состояниям решения, можно объединить так же, как и любые другие ограничения активации. Например, можно объединить ограничение активации, указывающее FullyLoaded решение и SingleProject решение для записи решений с одним проектом при полной загрузке.

this.EnabledWhen = ActivationConstraint.And(
    ActivationConstraint.SolutionState(SolutionState.SingleProject),
    ActivationConstraint.SolutionState(SolutionState.FullyLoaded));

Ключи контекста клиента

Правила активации также могут использовать содержимое контекста клиента в качестве частей его выражения.

В настоящее время контекст клиента ограничен небольшим набором значений в состоянии интегрированной среды разработки.