向层关系图添加命令和特定动作

可以定义上下文菜单命令和笔势处理程序层关系图中 Visual Studio 旗舰版。您可以将这些扩展打包到一个 Visual Studio 集成扩展 (VSIX) 中,并可以将其分发给其他 Visual Studio用户。

您可以根据需要在同一个 Visual Studio 项目中定义若干个命令和笔势处理程序。您还可以将若干个此类项目组合到一个 VSIX 中。例如,您可以定义单个 VSIX,其中包含层命令、域特定语言以及用于 UML 关系图的命令。

说明说明

您还可以自定义体系结构验证,用户源代码到层关系图进行比较。您应定义在单独 Visual Studio 项目的体系结构验证。可以将该方法添加到其他扩展所在的同一 VSIX 中。有关更多信息,请参见向层关系图添加自定义体系结构验证

创作层扩展的要求

您必须在要开发层扩展的计算机上安装了以下组件:

  • Visual Studio 旗舰版

  • Visual Studio SDK

  • 可视化和建模SDK

在新 VSIX 中定义命令或笔势

创建扩展的最快速方法是使用项目模板。这会将代码和 VSIX 清单放入同一个项目中。

使用项目模板定义扩展

  1. 通过使用**“文件”菜单上的“新建项目”**命令,在新解决方案中创建项目。

  2. 在**“新建项目”对话框中的“建模项目”下,选择“层设计器命令扩展”[Layer Designer Command Extension]“层设计器笔势扩展”[Layer Designer Gesture Extension]**。

    此模板将创建一个包含小型工作示例的项目。

  3. 若要测试扩展,请按 Ctrl+F5 或 F5。

    这将启动 Visual Studio 的实验实例。在此实例中创建一个层关系图。您的命令或笔势扩展应在此关系图中起作用。

  4. 关闭实验实例并修改代码示例。有关更多信息,请参见在程序代码中导航和更新层模型

  5. 可以将更多命令或笔势处理程序添加到同一个项目中。有关更多信息,请参见下列各节之一:

    定义菜单命令

    定义笔势处理程序

  6. 若要在 Visual Studio 的主实例中或在其他计算机上安装扩展,请在 bin\* 中找到 .vsix 文件。将该文件复制到要安装它的计算机中,然后双击它。若要卸载该文件,请使用**“工具”菜单上的“扩展管理器”**。

将命令或笔势添加到单独的 VSIX 中

若要创建一个包含命令、层验证程序和其他扩展的 VSIX,建议您创建一个项目来定义该 VSIX,并为处理程序创建单独的项目。有关其他类型的建模扩展的信息,请参见扩展 UML 模型和关系图

将层扩展添加到单独的 VSIX 中

  1. 在新的或现有的 Visual Studio 旗舰版解决方案中创建类库项目。在**“新建项目”对话框中,单击“Visual C#”,再单击“类库”**。此项目将包含命令或笔势处理程序类。

    说明说明

    您可以在一个类库中定义多个命令或笔势处理程序类,但应在单独类库中定义层验证类。

  2. 在您的解决方案中标识或创建 VSIX 项目。VSIX 项目包含一个名为 source.extension.vsixmanifest 的文件。添加 VSIX 项目:

    1. 在**“新建项目”对话框中,展开“Visual C#”,单击“扩展性”,再单击“VSIX 项目”**。

    2. 在解决方案资源管理器中,右击该 VSIX 项目,然后单击**“设为启动项目”**。

    3. 单击**“选择版本”[Select Editions]**,并确保选中 Visual Studio 旗舰版。

  3. source.extension.vsixmanifest,在 资产下,将命令或笔势处理程序项目添加为MEF组件。

    1. 资产.tab,选择 新建

    2. 类型,选择 *** Microsoft.VisualStudio.MefComponent ***

    3. ,选择" *** 在当前解决方案中的项目 *** 和选择命令或笔势处理程序项目的名称。

    4. 保存该文件。

  4. 返回到命令或笔势处理程序项目,然后添加以下项目引用。

引用

可完成的操作

Program Files \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ extensions \ Microsoft \体系结构tools \ ExtensibilityRuntime \ Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll

创建和编辑层

Microsoft.VisualStudio.Uml.Interfaces

创建和编辑层

Microsoft.VisualStudio.ArchitectureTools.Extensibility

修改关系图上的形状

System.ComponentModel.Composition

使用 Managed Extensibility Framework (MEF) 定义组件

Microsoft.VisualStudio.Modeling.Sdk.11.0

定义建模扩展

Microsoft.VisualStudio.Modeling.Sdk.Diagrams.11.0

更新形状和关系图

  1. 编辑 C# 类库项目中的类文件以包含扩展的代码。有关更多信息,请参见下列各节之一:

    定义菜单命令

    定义笔势处理程序

    另请参见在程序代码中导航和更新层模型

  2. 若要测试功能,请按 Ctrl+F5 或 F5。Visual Studio 的实验实例将打开。在此实例中创建或打开一个层关系图。

  3. 若要在 Visual Studio 的主实例中或其他计算机上安装 VSIX,请在 VSIX 项目的 bin 目录中找到 .vsix 文件。将该文件复制到要安装 VSIX 的计算机中。双击在Windows资源管理器(在Windows 8)的文件资源管理器的VSIX文件。

    若要卸载该文件,请使用**“工具”菜单上的“扩展管理器”**。

定义菜单命令

可以将更多菜单命令定义添加到现有笔势或命令项目中。每个命令均由一个具有以下特征的类定义:

  • 该类的声明方式如下:

    [LayerDesignerExtension]

    [Export(typeof(ICommandExtension))]

    public class MyLayerCommand : ICommandExtension { ... }

  • 该类的命名空间和名称无关紧要。

  • 以下为实现 ICommandExtension 的方法:

    • string Text {get;} - 菜单中显示的标签。

    • void QueryStatus(IMenuCommand command) - 当用户右击关系图时调用,确定是否应为用户当前选择显示并启用此命令。

    • void Execute(IMenuCommand command) - 当用户选择此命令时调用。

  • 若要确定当前选择,可导入 IDiagramContext:

    [Import]

    public IDiagramContext DiagramContext { get; set; }

    ...

    DiagramContext.CurrentDiagram.SelectedShapes.Count()...

有关更多信息,请参见在程序代码中导航和更新层模型

若要添加新命令,请新建一个包含下面示例的代码文件。然后测试并编辑该文件。

using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
using System.ComponentModel.Composition;
using System.Linq;

namespace MyLayerExtension // Change to your preference.
{
  // This is a feature for Layer diagrams:
  [LayerDesignerExtension]
  // This feature is a menu command:
  [Export(typeof(ICommandExtension))]
  // Change the class name to your preference:
  public class MyLayerCommand : ICommandExtension
  {
    [Import]
    public IDiagramContext DiagramContext { get; set; }

    [Import]
    public ILinkedUndoContext LinkedUndoContext { get; set; }

    // Menu command label:
    public string Text
    {
      get { return "Duplicate layers"; }
    }

    // Called when the user right-clicks the diagram.
    // Defines whether the command is visible and enabled.
    public void QueryStatus(IMenuCommand command)
    { 
      command.Visible = 
      command.Enabled = DiagramContext.CurrentDiagram
        .SelectedShapes.Count() > 0;
    }

    // Called when the user selects the command.
    public void Execute(IMenuCommand command)
    {
      // A selection of starting points:
      IDiagram diagram = this.DiagramContext.CurrentDiagram;
      ILayerModel lmodel = diagram.GetLayerModel();
      foreach (ILayer layer in lmodel.Layers)
      { // All layers in model.
      }
      // Updates should be performed in a transaction:
      using (ILinkedUndoTransaction t =
        LinkedUndoContext.BeginTransaction("copy selection"))
      {
        foreach (ILayer layer in 
          diagram.SelectedShapes
            .Select(shape=>shape.GetLayerElement())
            .Where(element => element is ILayer))
        {
          ILayer copy = lmodel.CreateLayer(layer.Name + "+");
          // Position the shapes:
          IShape originalShape = layer.GetShape();
          copy.GetShape().Move(
            originalShape.XPosition + originalShape.Width * 1.2,
            originalShape.YPosition);
        }
        t.Commit();
      }
    }
  }
}

定义笔势处理程序

笔势处理程序以响应,当用户拖动到层关系图上,因此,当用户关系图上的任意位置时双击。

对于现有命令或笔势处理程序 VSIX 项目,可以添加一个用于定义笔势处理程序的代码文件:

using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
using System.ComponentModel.Composition;
using System.Linq;
namespace MyLayerExtensions // change to your preference
{
  [LayerDesignerExtension]
  [Export(typeof(IGestureExtension))]
  public class MyLayerGestureHandler : IGestureExtension
  {
  }
}

请注意关于笔势处理程序的以下几点:

  • 以下是 IGestureExtension 的成员:

    OnDoubleClick - 当用户在关系图上的任意位置双击时调用。

    CanDragDrop - 当用户移动鼠标将某项拖到关系图上时重复调用。它必须快速工作。

    OnDragDrop - 当用户将某项放到关系图上时调用。

  • 对于每个方法的第一个参数是 IShape,可以访问层元素。例如:

            public void OnDragDrop(IShape target, IDataObject data)
            {
                ILayerElement element = target.GetLayerElement();
                if (element is ILayer)
                {
                    // ...
                }
            }
    
  • 已为某些类型的拖动项定义了处理程序。例如,用户可将项从解决方案资源管理器拖动到层关系图上。您无法为这些类型的项定义拖动处理程序。在这些情况下,将不会调用您的 DragDrop 方法。

有关如何在将其他项拖动到关系图上时对其解码的更多信息,请参见如何:在建模图上定义笔势处理程序

请参见

概念

在程序代码中导航和更新层模型

向层关系图添加自定义体系结构验证

如何:定义和安装建模扩展