自定义和扩展域特定语言

Visual Studio 建模和可视化 SDK (VMSDK) 提供可定义建模工具的多个级别:

  1. 使用 DSL 定义关系图定义域特定语言 (DSL)。 可以通过关系图表示法、可读 XML 格式以及生成代码和其他项目所需的基础工具快速创建 DSL。 有关详细信息,请参阅如何定义域特定语言

  2. 使用 DSL 定义的更多高级功能微调 DSL。 例如,可以在用户创建元素时显示其他链接。 这些技术主要在 DSL 定义中实现,而有些技术则需要几行程序代码。

  3. 通过使用程序代码扩展模型工具。 VMSDK 专门用于轻松将扩展和从 DSL 定义生成的代码相集成。 有关详细信息,请参阅编写代码以自定义域特定语言

注意

在更新 DSL 定义文件后,不要忘记在重新生成解决方案之前,先在“解决方案资源管理器”的工具栏中单击“转换所有模板”。

文章参考

实现此效果 请参阅本主题
允许用户设置形状的颜色和样式属性。 右键单击形状或连接线类,指向“添加已揭示项”,然后单击某一项。
关系图上不同类的模型元素看起来类似,共享初始高度和宽度、颜色和工具提示等属性。 使用形状或连接线类之间的继承。 派生形状和派生域类之间的映射继承父级的映射详细信息。

或者,将不同的域类映射到同一个形状类。
模型元素的类由不同的形状上下文显示。 将多个形状类映射到同一个域类。 当你生成解决方案时,请遵循错误报告,并提供所请求的代码以确定要使用的形状。
形状颜色或其他功能(如字体)指示当前状态。 请参阅更新形状和连接线以反映模型

创建更新已公开属性的规则。 请参阅规则在模型内部传播更改

或者,使用 OnAssociatedPropertyChanged() 更新未公开的功能,如链接箭头或字体。
形状上的图标更改为指示状态。 在“DSL 详细信息”窗口中设置修饰器映射的可见性。 在同一位置中查找多个图像修饰器。 请参阅更新形状和连接线以反映模型

或者,重写 ImageField.GetDisplayImage()。 请参阅 ImageField 中的示例。
在任何形状上设置背景图像 重写 InitializeInstanceResources() 以添加定位的 ImageField。
将形状嵌套到任何深度 设置递归嵌入树。 定义 BoundsRules 以包含形状。
在元素边界上的固定点附加连接线。 定义嵌入的终端元素,由关系图上的小端口表示。 使用 BoundsRules 就地修复端口。 请参阅可视化和建模 SDK 中的线路关系图示例。
文本字段显示从其他值派生的值。 将文本修饰器映射到计算或自定义存储域属性。 有关详细信息,请参阅计算和自定义存储属性
传播模型元素或形状之间的更改 请参阅域特定语言中的验证
将更改传播到存储外部的资源,如其他 Visual Studio 扩展。 请参阅事件处理程序在模型外部传播更改
“属性”窗口显示相关元素的属性。 设置属性转发。 请参阅自定义“属性”窗口
属性类别 “属性”窗口分为称为“类别”的各个部分。 设置域属性的“类别”。 具有相同类别名称的属性将出现在同一部分中。 还可以设置关系角色的“类别”。
控制用户对域属性的访问权限 将“可浏览”设置为“False”,以防止域属性在运行时出现在“属性”窗口中。 你仍可以将其映射到文本修饰器。

“Is UI Read Only”可防止用户更改域属性。

对域属性的程序访问不受影响。
更改 DSL 的模型资源管理器中节点的名称、图标和可见性。 请参阅自定义模型资源管理器
启用复制、剪切和粘贴 在 DSL 资源管理器中设置“编辑器”节点的“启用复制粘贴”属性。
每当复制某个元素时,就会复制引用链接及其目标。 例如,复制附加到某一项的注释。 设置源角色的“传播复制”属性(由 DSL 定义关系图中域关系一侧的行表示)。

编写代码以重写 ProcessOnCopy 来实现更复杂的效果。

请参阅自定义复制行为
删除元素时删除、重新链接相关元素或重新设置其父级。 设置关系角色的“传播删除”值。 为了获得更复杂的效果,请在 DomainModel.cs 中定义的 MyDslDeleteClosure 类中重写 ShouldVisitRelationshipShouldVisitRolePlayer 方法。
通过复制和拖放保留形状布局和外观。 将形状和连接线添加到已复制的 ElementGroupPrototype。 要重写的最简便方法是 ElementOperations.CreateElementGroupPrototype()

请参阅自定义复制行为
在所选位置(例如当前光标位置)粘贴形状。 重写 ClipboardCommandSet.ProcessOnCopy() 以使用特定于位置的版本的 ElementOperations.Merge(). 请参阅自定义复制行为
粘贴时创建其他链接 重写 ClipboardCommandSet.ProcessOnPasteCommand()
从此关系图、其他 DSL 和 Windows 元素启用拖放操作 请参阅如何:添加拖放处理程序
允许将形状或工具拖到子形状(例如端口)上,就像将其拖动到父级上一样。 在目标对象类上定义元素合并指令,以将已删除的对象转发到父级。 请参阅自定义元素创建和移动
允许将形状或工具拖到形状上,并创建其他链接或对象。 例如,允许将注释拖到要链接到的项上。 在目标域类上定义元素合并指令,并定义要生成的链接。 在复杂情况下,可以添加自定义代码。 请参阅自定义元素创建和移动
使用一个工具创建一组元素。 例如,具有一组固定端口的组件。 重写 ToolboxHelper.cs 中的工具箱初始化方法。 创建包含元素及其关系链接的元素组原型 (EGP)。 请参阅自定义工具和工具箱

将主体和端口形状包含在 EGP 中,或定义 BoundsRules 以在实例化 EGP 时定位端口形状。
使用一个连接工具来实例化多种类型的关系。 将链接连接指令 (LCD) 添加到工具调用的连接生成器中。 LCD 确定两个元素类型的关系的类型。 若要使其依赖于元素的状态,可以添加自定义代码。 请参阅自定义工具和工具箱
粘滞工具 - 用户可以双击任意工具以连续创建多个形状或连接线。 在 DSL 资源管理器中,选择 Editor 节点。 在“属性”窗口中,设置“Uses Sticky Toolbox Items”。
定义菜单命令 请参阅如何:修改标准的菜单命令
用验证规则对模型进行约束 请参阅域特定语言中的验证
从 DSL 生成代码、配置文件或文档。 从域特定语言生成代码
自定义模型保存到文件的方式。 请参阅自定义文件存储和 XML 序列化
将模型保存到数据库或其他介质。 重写 YourLanguageDocData

请参阅自定义文件存储和 XML 序列化
集成多个 DSL,使其作为一个应用程序的一部分工作。 请参阅使用 Visual Studio Modelbus 集成模型
允许第三方扩展 DSL,并控制扩展。 使用 MEF 扩展 DSL

使用 DSL 库在 DSL 之间共享类

定义锁定策略以创建只读段

注意

“文本模板转换”组件将作为“Visual Studio 扩展开发”工作负载的一部分自动安装 。 还可以从 Visual Studio 安装程序的“SDK、库和框架”类别下的“单个组件”选项卡进行安装 。 从“单个组件”选项卡安装“建模 SDK”组件 。