Agregar comandos y gestos a diagramas de dependenciaAdd commands and gestures to dependency diagrams

Puede definir comandos del menú contextual y controladores de gestos en diagramas de dependencia en Visual Studio.You can define context menu commands and gesture handlers on dependency diagrams in Visual Studio. Estas extensiones se pueden empaquetar en una extensión de integración de Visual Studio (VSIX) que luego puede distribuir a otros usuarios de Visual Studio.You can package these extensions into a Visual Studio Integration Extension (VSIX) that you can distribute to other Visual Studio users.

Si lo desea, puede definir varios controladores de comandos y gestos en el mismo proyecto de Visual Studio.You can define several command and gesture handlers in the same Visual Studio project if you want. También puede combinar varios proyectos de este tipo en un VSIX.You can also combine several such projects into one VSIX. Por ejemplo, podría definir un VSIX único que incluya comandos de capa y un lenguaje específico de dominio.For example, you could define a single VSIX that includes layer commands, and a domain-specific language.

Nota

También puede personalizar la validación de arquitectura, en qué usuarios código fuente se compara con los diagramas de dependencia.You can also customize architecture validation, in which users' source code is compared with dependency diagrams. La validación de arquitectura debe definirse en un proyecto de Visual Studio independiente.You should define architecture validation in a separate Visual Studio project. Puede agregarlo al mismo VSIX que otras extensiones.You can add it to the same VSIX as other extensions. Para obtener más información, consulte agregar validación de arquitectura personalizada a diagramas de dependencia.For more information, see Add custom architecture validation to dependency diagrams.

RequisitosRequirements

Vea Requisitos.See Requirements.

Definir un comando o gesto en un nuevo VSIXDefining a Command or Gesture in a New VSIX

El método más rápido para crear una extensión consiste en usar la plantilla de proyecto.The quickest method of creating an extension is to use the project template. Esto coloca el código y el manifiesto de VSIX en el mismo proyecto.This places the code and the VSIX manifest into the same project.

Para definir una extensión mediante una plantilla de proyectoTo define an extension by using a project template

  1. Cree un proyecto en una nueva solución mediante el comando Nuevo proyecto del menú Archivo .Create a project in a new solution, by using the New Project command on the File menu.

  2. En el cuadro de diálogo Nuevo proyecto , en Proyectos de modelado, seleccione Layer Designer Command Extension (Extensión de comandos del diseñador de capas) o Layer Designer Gesture Extension(Extensión de gestos del diseñador de capas).In the New Project dialog box, under Modeling Projects, select either Layer Designer Command Extension or Layer Designer Gesture Extension.

    La plantilla crea un proyecto que contiene un pequeño ejemplo funcional.The template creates a project that contains a small working example.

  3. Para probar la extensión, presione CTRL+F5 o F5.To test the extension, press CTRL+F5 or F5.

    Inicia una instancia experimental de Visual Studio.An experimental instance of Visual Studio starts. En este caso, cree un diagrama de dependencia.In this instance, create a dependency diagram. El comando o extensión de gesto debería funcionar en este diagrama.Your command or gesture extension should work in this diagram.

  4. Cierre la instancia experimental y modifique el código de muestra.Close the experimental instance and modify the sample code. Para obtener más información, consulte navegar y actualizar modelos en el código de programa de capas.For more information, see Navigate and update layer models in program code.

  5. Puede agregar más controladores de comandos o de gestos al mismo proyecto.You can add more command or gesture handlers to the same project. Para obtener más información, vea una de las secciones siguientes:For more information, see one of the following sections:

    Definir un comando de menúDefining a Menu Command

    Definir un controlador de gestosDefining a Gesture Handler

  6. Para instalar la extensión en la instancia principal de Visual Studio o en otro equipo, busque la .vsix en el archivo bin\\.To install the extension in the main instance of Visual Studio, or on another computer, find the **.vsix* file in bin\\. Cópielo en el equipo donde desea instalarlo y, a continuación, haga doble clic en él.Copy it to the computer where you want to install it, and then double-click it. Para desinstalarla, use **Extensiones y actualizaciones* en el menú Herramientas .To uninstall it, use Extensions and Updates on the Tools menu.

Agregar un comando o gesto a un VSIX independienteAdding a Command or Gesture to a separate VSIX

Si desea crear un VSIX que contenga comandos, validadores de capas y otras extensiones, le recomendamos que cree un proyecto para definir VSIX y proyectos independientes para los controladores.If you want to create one VSIX that contains commands, layer validators, and other extensions, we recommend that you create one project to define the VSIX, and separate projects for the handlers.

Para agregar extensiones de nivel a un VSIX independienteTo add layer extensions to a separate VSIX

  1. Cree un proyecto de biblioteca de clases en una solución de Visual Studio nueva o en una existente.Create a Class Library project in a new or existing Visual Studio solution. En el cuadro de diálogo Nuevo proyecto , haga clic en Visual C# y haga clic en Biblioteca de clases.In the New Project dialog box, click Visual C# and then click Class Library. Este proyecto contendrá clases de controlador de comandos o de gestos.This project will contain command or gesture handler classes.

    Nota

    Puede definir más de una clase de controlador de comandos o de gestos en una biblioteca de clases, pero debe definir las clases de validación de capas en una biblioteca de clases independiente.You can define more than one command or gesture handler class in one class library, but you should define layer validation classes in a separate class library.

  2. Identifique o cree un proyecto de VSIX en la solución.Identify or create a VSIX project in your solution. Un proyecto de VSIX contiene un archivo denominado source.extension.vsixmanifest.A VSIX project contains a file that is named source.extension.vsixmanifest. Para agregar una clase a un proyecto de VSIX:To add a VSIX project:

    1. En el cuadro de diálogo Nuevo proyecto , expanda Visual C#, haga clic en Extensibility(Extensibilidad) y, a continuación, en VSIX Project(Proyecto de VSIX).In the New Project dialog box, expand Visual C#, then click Extensibility, and then click VSIX Project.

    2. En el Explorador de soluciones, haga clic con el botón secundario en el proyecto de VSIX y, a continuación, haga clic en Establecer como proyecto de inicio.In Solution Explorer, right-click the VSIX project and then click Set as Startup Project.

    3. Haga clic en Seleccionar ediciones y asegúrese de que Visual Studio está activado.Click Select Editions and make sure that Visual Studio is checked.

  3. En source.extension.vsixmanifest, en Activos, agregue el proyecto de controlador de comandos o de gestos como componente MEF.In source.extension.vsixmanifest, under Assets, add the command or gesture handler project as a MEF component.

    1. En la pestaña Activos, elija Nuevo.In the Assets.tab, choose New.

    2. En Tipo, seleccione Microsoft.VisualStudio.MefComponent.At Type, select Microsoft.VisualStudio.MefComponent.

    3. En Origenseleccione el proyecto de la solución actual y seleccione el nombre del proyecto de controlador de comandos o de gestos.At Source, select Project in current solution and select the name of your command or gesture handler project.

    4. Guarde el archivo.Save the file.

  4. Vuelva al proyecto de controlador de comandos o de gestos, y agregue las siguientes referencias de proyecto.Return to the command or gesture handler project, and add the following project references.

ReferenciaReference Qué permite hacerWhat this allows you to do
Archivos de programa\Microsoft Visual Studio [versión]\Common7\IDE\Extensions\Microsoft\Architecture Tools\ExtensibilityRuntime\Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dllProgram Files\Microsoft Visual Studio [version]\Common7\IDE\Extensions\Microsoft\Architecture Tools\ExtensibilityRuntime\Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll Crear y modificar las capasCreate and edit layers
Microsoft.VisualStudio.Uml.InterfacesMicrosoft.VisualStudio.Uml.Interfaces Crear y modificar las capasCreate and edit layers
Microsoft.VisualStudio.ArchitectureTools.ExtensibilityMicrosoft.VisualStudio.ArchitectureTools.Extensibility Modificar formas en los diagramasModify shapes on diagrams
System.ComponentModel.CompositionSystem.ComponentModel.Composition Definir componentes mediante MEF (Managed Extensibility Framework)Define components using Managed Extensibility Framework (MEF)
Microsoft.VisualStudio.Modeling.Sdk.[versión]Microsoft.VisualStudio.Modeling.Sdk.[version] Definir las extensiones de modeladoDefine modeling extensions
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.[versión]Microsoft.VisualStudio.Modeling.Sdk.Diagrams.[version] Actualizar formas y diagramasUpdate shapes and diagrams
  1. Edite el archivo de clases en el proyecto de biblioteca de clases de C# para que contenga el código de la extensión.Edit the class file in the C# class library project to contain the code for your extension. Para obtener más información, vea una de las secciones siguientes:For more information, see one of the following sections:

    Definir un comando de menúDefining a Menu Command

    Definir un controlador de gestosDefining a Gesture Handler

    Vea también navegar y actualizar modelos en el código de programa de capas.See also Navigate and update layer models in program code.

  2. Para probar la característica, presione CTRL+F5 o F5.To test the feature, press CTRL+F5 or F5. Se abre una instancia experimental de Visual Studio.An experimental instance of Visual Studio opens. En este caso, cree o abra un diagrama de dependencia.In this instance, create or open a dependency diagram.

  3. Para instalar VSIX en la instancia principal de Visual Studio o en otro equipo, busque la .vsix un archivo en el bin directorio del proyecto VSIX.To install the VSIX in the main instance of Visual Studio, or on another computer, find the .vsix file in the bin directory of the VSIX project. Cópielo en el equipo donde desea instalar VSIX.Copy it to the computer where you want to install the VSIX. En el Explorador de Windows, haga doble clic en el archivo VSIX.Double-click the VSIX file in Windows Explorer.

    Para desinstalarla, use Extensiones y actualizaciones en el menú Herramientas .To uninstall it, use Extensions and Updates on the Tools menu.

Definir un comando de menúDefining a Menu Command

Puede agregar más definiciones de comando de menú a un proyecto de gesto o comando existente.You can add more menu command definitions to an existing gesture or command project. Cada comando se define con una clase que tiene las siguientes características:Each command is defined by a class that has the following characteristics:

  • La clase se declara de la siguiente forma:The class is declared as follows:

    [LayerDesignerExtension]

    [Export(typeof(ICommandExtension))]

    public class MyLayerCommand : ICommandExtension { ... }public class MyLayerCommand : ICommandExtension { ... }

  • El espacio de nombres y el nombre de la clase son insignificantes.The namespace and the name of the class are unimportant.

  • Los métodos que implementan ICommandExtension son los siguientes:The methods that implement ICommandExtension are as follows:

    • string Text {get;} - La etiqueta que aparece en el menú.string Text {get;} - The label that appears in the menu.

    • void QueryStatus(IMenuCommand command) - se le llama cuando el usuario hace clic con el botón secundario en el diagrama y determina si el comando debería estar visible y habilitado para la selección actual del usuario.void QueryStatus(IMenuCommand command) - called when the user right-clicks the diagram, and determines whether the command should be visible and enabled for the user's current selection.

    • void Execute(IMenuCommand command) - se le llama cuando el usuario selecciona el comando.void Execute(IMenuCommand command) - called when the user selects the command.

  • Para determinar la selección actual, puede importar IDiagramContext:To determine the current selection, you can import IDiagramContext:

    [Import]

    public IDiagramContext DiagramContext { get; set; }

    ...

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

    Para obtener más información, consulte navegar y actualizar modelos en el código de programa de capas.For more information, see Navigate and update layer models in program code.

    Para agregar un nuevo comando, cree un nuevo archivo de código que contenga el siguiente ejemplo.To add a new command, create a new code file that contains the following sample. A continuación, pruébelo y modifíquelo.Then test and edit it.

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 dependency 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();
      }
    }
  }
}

Definir un controlador de gestosDefining a Gesture Handler

Un controlador de gestos responde cuando el usuario arrastra elementos hasta el diagrama de dependencia, y cuando el usuario hace doble clic en cualquier lugar en el diagrama.A gesture handler responds when the user drags items onto the dependency diagram, and when the user double-clicks anywhere in the diagram.

En el proyecto de VSIX existente de controlador de comandos o gestos, puede agregar un archivo de código que defina un controlador de gestos:To your existing command or gesture handler VSIX project, you can add a code file that defines a gesture handler:

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
  {
  }
}

Observe los siguientes aspectos sobre los controladores de gestos:Notice the following points about gesture handlers:

  • Los miembros de IGestureExtension son los siguientes:The members of IGestureExtension are as follows:

    OnDoubleClick : se le llama cuando el usuario hace doble clic en cualquier parte en el diagrama.OnDoubleClick - called when the user double-clicks anywhere on the diagram.

    CanDragDrop : se le llama repetidamente cuando el usuario mueve el mouse mientras arrastra un elemento al diagrama.CanDragDrop - called repeatedly as the user moves the mouse while dragging an item onto the diagram. Debe funcionar rápidamente.It must work quickly.

    OnDragDrop : se le llama cuando el usuario coloca un elemento en el diagrama.OnDragDrop - called when the user drops an item onto the diagram.

  • El primer argumento de cada método es IShape, a partir del cual puede obtener el elemento de capa.The first argument to each method is an IShape, from which you can get the layer element. Por ejemplo:For example:

    public void OnDragDrop(IShape target, IDataObject data)
    {
        ILayerElement element = target.GetLayerElement();
        if (element is ILayer)
        {
            // ...
        }
    }
    
  • Ya se han definido los controladores para algunos tipos de elemento arrastrado.Handlers for some types of dragged item are already defined. Por ejemplo, el usuario puede arrastrar elementos desde el Explorador de soluciones a un diagrama de dependencia.For example, the user can drag items from Solution Explorer onto a dependency diagram. No puede definir un controlador de arrastre para estos tipos de elemento.You cannot define a drag handler for these types of item. En estos casos, no se invocarán los métodos DragDrop .In these cases, your DragDrop methods will not be invoked.

Vea tambiénSee Also