如何:使用域特定语言修改标准的菜单命令

可以修改的一些的行为在 DSL 自动定义标准命令。 例如,您可以修改 剪辑 ,以便不包括敏感信息。 为此,可以复盖命令设置类的方法。 这些类在 CommandSet.cs 文件中定义,在 DslPackage 项目并从 CommandSet派生。

总之,修改命令:

  1. 查看哪些命令可以修改。

  2. 创建相应的命令设置的类的分部声明。

  3. 命令的重写 ProcessOnStatus 和 ProcessOnMenu 方法 。

本主题说明此过程。

备注

如果要创建拥有菜单命令,请参见 如何:向快捷菜单中添加命令

可以修改哪些命令?

查看哪些命令可以修改

  1. 在 DslPackage 项目中,打开 GeneratedCode \CommandSet .cs。 此 C# 文件可以在解决方案资源管理器中找到作为 CommandSet.tt开销。

  2. 查找在名称以 “CommandSet”结尾的此文件的类,例如 Language1CommandSet 和 Language1ClipboardCommandSet。

  3. 在每个指令设置的类,键入 “空间”后跟override。 IntelliSense 将显示方法的列表可以重写。 每个命令的名称以 “ProcessOnStatus”和 “ProcessOnMenu”方法对。

  4. 请注意哪些命令来设置类包含要修改的命令。

  5. 关闭文件,而无需保存已编辑。

    备注

    通常,您不能编辑生成的文件。文件生成的任何编辑都将在下次丢失。

扩展相应的命令设置的类

创建包含命令设置的类的分部声明的新文件。

扩展命令设置的类

  1. 在解决方案资源管理器中, DslPackage 项目中,打开 GeneratedCode 文件夹中查找在 CommandSet.tt 下并打开其生成的文件 CommandSet.cs。 请注意命名空间和其中定义在该处质数的名称。 例如,您可能会发现:

    namespace Company.Language1

    { ... internal partial class Language1CommandSet : ...

  2. DslPackage,创建一个名为 " 的文件夹 "。 此文件夹中,创建一个名为 CommandSet.cs的新的类文件。

  3. 在新文件,编写具有命名空间和名称以及生成的分部类相同的分部声明。 例如:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.Design;
    namespace Company.Language1 /* Make sure this is correct */
    { internal partial class Language1CommandSet { ...
    

    是否请注意可使用类文件模板创建新文件,必须更正命名空间和类名。

重写命令方法

大多数命令具有两个关联的方法:与名称的方法 ProcessOnStatus希望… 确定是否应显示并启用。 它不调用,只要用户右击关系图,然后应快速执行并进行更改。 ProcessOnMenu… 调用,当用户单击命令时,应执行命令的功能。 您可能需要重写或。这些方法。

Dd820672.collapse_all(zh-cn,VS.110).gif更改; 如果该命令将出现在菜单

重写 ProcessOnStatus… 方法。 此方法来设置其参数 MenuCommand 显示并启用的属性。 通常命令查看 this.CurrentSelection 确定是否适用于所选元素,并且可能同时查看其属性确定是否可以在当前状态可以适用。

作为通用准则,应哪些组件取决于该可视属性中选择。 enabled 特性,确定是否显示为黑色或灰色在菜单上,应依赖于选定内容的当前状态。

,当用户选择了多个形状,下面的示例禁用删除菜单项。

备注

此方法不会影响该命令是否可以通过键击可用。例如,若要禁用删除菜单项不阻止命令是通过 delete 键。

/// <summary>
/// Called when user right-clicks on the diagram or clicks the Edit menu.
/// </summary>
/// <param name="command">Set Visible and Enabled properties.</param>
protected override void ProcessOnStatusDeleteCommand (MenuCommand command)
{
  // Default settings from the base method.
  base.ProcessOnStatusDeleteCommand(command);
  if (this.CurrentSelection.Count > 1)
  {
    // If user has selected more than one item, Delete is greyed out.
    command.Enabled = false;
  }
}

它是您不关心的很好的做法首先调用基方法,处理所有用例和设置。

ProcessOnStatus 方法不应存储在创建,删除或更新元素。

Dd820672.collapse_all(zh-cn,VS.110).gif更改命令的行为

重写 ProcessOnMenu… 方法。 即使使用 delete 键,下面的示例阻止用户一次删除多个元素,。

/// <summary>
/// Called when user presses Delete key 
/// or clicks the Delete command on a menu.
/// </summary>
protected override void ProcessOnMenuDeleteCommand()
{
  // Allow users to delete only one thing at a time.
  if (this.CurrentSelection.Count <= 1)
  {
    base.ProcessOnMenuDeleteCommand();
  }
}

如果代码对存储的更改,例如创建,删除或更新元素或链接,则必须先在事务内。 有关更多信息,请参见 如何:使用域特定语言修改标准的菜单命令

Dd820672.collapse_all(zh-cn,VS.110).gif编写方法的代码

以下片段在这些方法中通常很有用:

  • this.CurrentSelection. 用户右击的形状中始终包含列表形状和连接线。 如果用户单击关系图的空白部分,关系图是列表的成员。

  • this.IsDiagramSelected() -true ,如果用户单击关系图的空白部分。

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection() - 用户未选择多个形状

  • this.SingleSelection - 用户右击的形状或关系图

  • shape.ModelElement as MyLanguageElement - 形状表示的模型元素。

有关如何从元素进行导航的更多信息到元素以及如何创建对象和链接,请参见 在程序代码中导航和更新模型

请参见

任务

如何:向快捷菜单中添加命令

[重定向] 演练:从选择的链接中获取信息

参考

MenuCommand

概念

Vspackage 如何将用户界面元素到 IDE

VSCT XML 架构参考

其他资源

编写代码以自定义域特定语言

Visual Studio 命令 (表。Vsct) 文件

VMSDK - 电路图示例。广泛的 DSL Customizationhttps://code.msdn.microsoft.com/Visualization-Modeling-SDK-763778e8Sample

代码:电路 Diagramshttps://code.msdn.microsoft.com/Visualization-Modeling-SDK-763778e8