Visual Studio 建模和可视化 SDK (VMSDK) 提供了多个级别,可在其中定义建模工具:
- 使用 DSL 定义图定义领域特定语言(DSL)。 可以使用图表表示法、可读 XML 窗体和生成代码和其他项目所需的基本工具快速创建 DSL。 有关详细信息,请参阅 “如何定义 Domain-Specific 语言”。 
- 通过使用 DSL 定义的高级功能来精细调整 DSL。 例如,用户可以在用户创建元素时显示其他链接。 这些技术大多是在 DSL 定义中实现的,有些技术需要几行程序代码。 
- 使用程序代码扩展建模工具。 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类中重写ShouldVisitRelationship和ShouldVisitRolePlayer方法。 | 
| 在复制和拖放时保留形状布局和外观。 | 将形状和连接线添加到已复制的 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 组件。