可以定义上下文菜单命令和笔势处理程序层关系图中 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组件。
在 资产.tab,选择 新建。
在 类型,选择 *** Microsoft.VisualStudio.MefComponent ***。
在 源,选择" *** 在当前解决方案中的项目 *** 和选择命令或笔势处理程序项目的名称。
保存该文件。
返回到命令或笔势处理程序项目,然后添加以下项目引用。
引用 |
可完成的操作 |
---|---|
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 |
更新形状和关系图 |
编辑 C# 类库项目中的类文件以包含扩展的代码。有关更多信息,请参见下列各节之一:
定义菜单命令
定义笔势处理程序
另请参见在程序代码中导航和更新层模型。
若要测试功能,请按 Ctrl+F5 或 F5。Visual Studio 的实验实例将打开。在此实例中创建或打开一个层关系图。
若要在 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 方法。
有关如何在将其他项拖动到关系图上时对其解码的更多信息,请参见如何:在建模图上定义笔势处理程序。