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

更新:2010 年 12 月

利用此 Visual Studio 2010 功能包,通过定义快捷菜单或上下文菜单、命令和笔势处理程序,您可以在 Visual Studio 2010 旗舰版中扩展层关系图。 您可以将这些扩展打包到一个 Visual Studio 集成扩展 (VSIX) 中,并可以将其分发给其他 Visual Studio 旗舰版用户。 有关更多信息,请参见 Visual Studio 功能包

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

提示

若要定义一个自定义体系结构验证方法,则应在单独的 Visual Studio 项目中定义该方法。 可以将该方法添加到其他扩展所在的同一 VSIX 中。 有关更多信息,请参见向层关系图添加自定义体系结构验证

要求

有关要求和安装说明,请参见创建层关系图的扩展 中的要求

在新 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. 单击**“添加内容”**。

    2. 在**“选择内容类型”处,选择“MEF 组件”**。

    3. 在**“选择源”[Select a source]处,单击“项目”**,并选择命令或笔势处理程序项目的名称。

    4. 保存该文件。

  4. 在**“引用”下,单击“添加引用”**,然后选择此功能包的运行时。

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

引用

可完成的操作

如果您安装了 Visual Studio 2010 可视化和建模功能包:

%LocalAppData%\Microsoft\VisualStudio\10.0\Extensions\Microsoft\Visualization and Modeling Feature Pack Runtime\1.0\Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll

注意注意
%LocalAppData% 通常为“驱动器名称:\Users\用户名\AppData\Local”。在 Windows XP 或 Windows 2003 上,使用 %AppData% 而不使用 %LocalAppData%。

如果您安装了 Visual Studio 2010 功能包 2:

…\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Visualization and Modeling Feature Pack Runtime\1.0\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.10.0

定义建模扩展

Microsoft.VisualStudio.Modeling.Sdk.Diagrams.10.0

更新形状和关系图

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

    定义菜单命令

    定义笔势处理程序

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

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

  3. 若要在 Visual Studio 的主实例中或其他计算机上安装 VSIX,请在 VSIX 项目的 bin 目录中找到 .vsix 文件。 将该文件复制到要安装 VSIX 的计算机中。 在 Windows 资源管理器中双击 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.ArchitectureTools.Extensibility.Uml; 
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.ArchitectureTools.Extensibility.Uml;
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 - 当用户将某项放到关系图上时调用。

  • 每个方法的第一个参数均是 ShapeElement。 可将此参数转换成一个更简便的用于建模的包装 IShape:

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

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

请参见

其他资源

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

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

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

修订记录

日期

修订记录

原因

2010 年 12 月

针对 Visual Studio 2010 功能包 2 更新了内容。

信息补充。