VisualStudio.Extensibility 中的一个常见概念是使用基于上下文的激活规则。 这些规则控制扩展或命令向用户显示的条件。 基于上下文的激活规则的一个示例是 VisibleWhen 命令配置中的属性,该属性在命令可见时声明。
约束类型
每个约束都定义为ActivationConstraint类型的一个实例,该实例是通过ActivationConstraint的一个工厂方法创建的,例如ClientContext。
可以使用And、Or和Not方法将多个激活约束组合在一起。 还可以使用运算符 &, |, 和 ! 组合激活约束。
示例定义
在以下示例中,命令配置属性 EnabledWhen 定义命令处于启用状态时。 该ClientContext 方法是激活约束工厂方法之一。 它根据两个参数(字符串和正则表达式模式)生成激活约束,以便与该字符串匹配。 因此,以下代码指示当用户选择具有其中一个扩展名的文件时,会启用命令。
public override CommandConfiguration CommandConfiguration => new("%My command.DisplayName%")
{
EnabledWhen = ActivationConstraint.ClientContext(ClientContextKey.Shell.ActiveSelectionFileName, @"\.(jpg|jpeg|txt)$"),
};
该 ClientContextKey 类提供可以测试的 IDE 状态信息范围;对于值表,请参阅 客户端上下文键。
以下示例演示如何组合多个约束:
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>=ClientContextKey,<pattern>=<regex>) |
如果提供的客户端上下文键与正则表达式匹配,则为 True。 请参阅 客户端上下文密钥。 |
ActiveProjectCapability(<表达式>=ProjectCapability) |
如果解决方案中有项目的功能与所提供的子表达式匹配,则结果为 True。 表达式可以是类似 VB | CSharp。 有关项目功能的详细信息,请参阅 Project 查询 API 概述。 |
ProjectAddedItem(<模式>=<正则表达式>) |
当将匹配“pattern”的文件添加到已打开的解决方案中的项目时,该条件为 true。 |
SolutionHasProjectCapability(<表达式>=ProjectCapability) |
如果解决方案中有一个项目具有匹配所给子表达式的功能,则为 True。 表达式可以是类似 VB | CSharp。 有关项目功能的详细信息,请参阅 Project 查询 API 概述。 |
SolutionState(<state>=SolutionState) |
当解决方案状态与提供的值匹配时,请参阅 解决方案状态 以了解值列表。 |
EditorContentType(<contentType>) |
当活动编辑器的内容类型为或继承自特定的内容类型时,其值为 True。 |
出于兼容性原因,还支持以下旧激活约束:
| 术语 | Description |
|---|---|
ActiveProjectBuildProperty(<属性>=<正则表达式>) |
如果所选项目具有指定的构建属性,并且属性值与提供的正则表达式模式匹配,则该术语为 true。 |
ActiveProjectFlavor(<guid>) |
只要所选项目具有与给定项目类型 GUID 匹配的风格,则为 True。 |
SolutionHasProjectBuildProperty(<property>=<regex>) |
如果解决方案中加载的项目具有指定的构建属性,且属性值与提供的正则表达式过滤器匹配,则条件为真。 |
SolutionHasProjectFlavor(<GUID>) |
每当解决方案中存在一个聚合的项目,它的风格与给定项目类型的 GUID 匹配时,条件为 True。 |
UIContext(<guid>) |
如果指定的 UI 上下文 在 Visual Studio 实例中处于活动状态,则为 True。 |
解决方案状态
解决方案状态是指解决方案及其项目的状态,解决方案是否已加载,是否包含零、一个或多个项目,以及它是否正在构建。
与解决方案状态相对应的激活约束可以与其他激活约束一样组合。 例如,可以合并激活约束,该 FullyLoaded 约束指定解决方案和 SingleProject 解决方案,以便在完全加载时捕获单项目解决方案。
this.EnabledWhen = ActivationConstraint.And(
ActivationConstraint.SolutionState(SolutionState.SingleProject),
ActivationConstraint.SolutionState(SolutionState.FullyLoaded));
客户端上下文密钥
激活规则还可以利用 客户端上下文 内容作为其表达式的一部分。
目前,客户端上下文仅限于 IDE 状态中的一 小部分值 。