向层关系图添加命令和特定动作
可以定义上下文菜单命令和笔势处理程序层关系图中 Visual Studio 旗舰版。 您可以将这些扩展打包到一个 Visual Studio 集成扩展 (VSIX) 中,并可以将其分发给其他 Visual Studio用户。
您可以根据需要在同一个 Visual Studio 项目中定义若干个命令和笔势处理程序。 您还可以将若干个此类项目组合到一个 VSIX 中。 例如,您可以定义单个 VSIX,其中包含层命令、域特定语言以及用于 UML 关系图的命令。
备注
您还可以自定义体系结构验证,用户源代码到层关系图进行比较。您应定义在单独 Visual Studio 项目的体系结构验证。可以将该方法添加到其他扩展所在的同一 VSIX 中。有关详细信息,请参阅向层关系图添加自定义体系结构验证。
创作层扩展的要求
您必须在要开发层扩展的计算机上安装了以下组件:
Visual Studio 旗舰版
Visual Studio SDK
可视化和建模SDK
在新 VSIX 中定义命令或笔势
创建扩展的最快速方法是使用项目模板。 这会将代码和 VSIX 清单放入同一个项目中。
使用项目模板定义扩展
通过使用**“文件”菜单上的“新建项目”**命令,在新解决方案中创建项目。
在**“新建项目”对话框中的“建模项目”下,选择“层设计器命令扩展”[Layer Designer Command Extension]或“层设计器笔势扩展”[Layer Designer Gesture Extension]**。
此模板将创建一个包含小型工作示例的项目。
若要测试扩展,请按 Ctrl+F5 或 F5。
这将启动 Visual Studio 的实验实例。 在此实例中创建一个层关系图。 您的命令或笔势扩展应在此关系图中起作用。
关闭实验实例并修改代码示例。 有关详细信息,请参阅在程序代码中导航和更新层模型。
可以将更多命令或笔势处理程序添加到同一个项目中。 有关更多信息,请参见下列各节之一:
定义菜单命令
定义笔势处理程序
若要在 Visual Studio 的主实例中或在其他计算机上安装扩展,请在 bin\* 中找到 .vsix 文件。 将该文件复制到要安装它的计算机中,然后双击它。 若要卸载该文件,请使用**“工具”菜单上的“扩展管理器”**。
将命令或笔势添加到单独的 VSIX 中
若要创建一个包含命令、层验证程序和其他扩展的 VSIX,建议您创建一个项目来定义该 VSIX,并为处理程序创建单独的项目。 有关其他类型的建模扩展的信息,请参见扩展 UML 模型和关系图。
将层扩展添加到单独的 VSIX 中
在新的或现有的 Visual Studio 旗舰版解决方案中创建类库项目。 在**“新建项目”对话框中,单击“Visual C#”,再单击“类库”**。 此项目将包含命令或笔势处理程序类。
备注
您可以在一个类库中定义多个命令或笔势处理程序类,但应在单独类库中定义层验证类。
在您的解决方案中标识或创建 VSIX 项目。 VSIX 项目包含一个名为 source.extension.vsixmanifest 的文件。 添加 VSIX 项目:
在**“新建项目”对话框中,展开“Visual C#”,单击“扩展性”,再单击“VSIX 项目”**。
在解决方案资源管理器中,右击该 VSIX 项目,然后单击**“设为启动项目”**。
单击**“选择版本”[Select Editions]**,并确保选中 Visual Studio 旗舰版。
在 source.extension.vsixmanifest 中的资产下,将命令或笔势处理程序项目添加为 MEF 组件。
在 资产选项卡中,选择 新建。
在 类型,选择 Microsoft.VisualStudio.MefComponent。
在源处,选择“当前解决方案的项目”,并选择命令或笔势处理程序项目的名称。
保存该文件。
返回到命令或笔势处理程序项目,然后添加以下项目引用。
引用 |
可完成的操作 |
---|---|
Program Files\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Architecture 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.12.0 |
定义建模扩展 |
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.12.0 |
更新形状和关系图 |
编辑 C# 类库项目中的类文件以包含扩展的代码。 有关更多信息,请参见下列各节之一:
定义菜单命令
定义笔势处理程序
另请参见在程序代码中导航和更新层模型。
若要测试功能,请按 Ctrl+F5 或 F5。 Visual Studio 的实验实例将打开。 在此实例中创建或打开一个层关系图。
若要在 Visual Studio 的主实例中或其他计算机上安装 VSIX,请在 VSIX 项目的 bin 目录中找到 .vsix 文件。 将该文件复制到要安装 VSIX 的计算机中。 双击 Windows 资源管理器 (windows8 的文件资源管理器)的 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 方法。
有关如何在将其他项拖动到关系图上时对其解码的更多信息,请参见如何:在建模图上定义笔势处理程序。