自定义和扩展特定于域的语言

Visual Studio 建模和可视化 SDK (VMSDK) 提供了多个级别,可在其中定义建模工具:

  1. 使用 DSL 定义图定义领域特定语言(DSL)。 可以使用图表表示法、可读 XML 窗体和生成代码和其他项目所需的基本工具快速创建 DSL。 有关详细信息,请参阅 “如何定义 Domain-Specific 语言”。

  2. 通过使用 DSL 定义的高级功能来精细调整 DSL。 例如,用户可以在用户创建元素时显示其他链接。 这些技术大多是在 DSL 定义中实现的,有些技术需要几行程序代码。

  3. 使用程序代码扩展建模工具。 VMSDK 专用于将扩展与从 DSL 定义生成的代码集成起来。 有关详细信息,请参阅 编写代码以自定义 Domain-Specific 语言

注释

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

参考文献

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

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

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

或者,使用 OnAssociatedPropertyChanged() 更新不公开的功能,如链接箭头或字体。
形状上的图标发生变化以指示状态。 在 DSL 详情窗口中设置装饰器映射的可见性。 在同一位置定位多个图像修饰器。 请参阅 更新形状和连接线以反映模型

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

UI 是否只读 用于阻止用户更改域属性。

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

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

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

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

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

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

使用 DSL 库在 DSL 之间共享类

定义用于创建 Read-Only 段的锁定策略

注释

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