Adicionando comandos e gestos para diagramas de camada

Você pode definir os comandos de menu de contexto e gesto manipuladores em diagramas de camada de Visual Studio Ultimate.Você pode empacotar estas extensões em um Visual Studio integração extensão (VSIX) que você pode distribuir para outros Visual Studio os usuários.

Você pode definir vários manipuladores de comando e o gesto na mesma Visual Studio de projeto se você desejar.Você também pode combinar várias tais projetos em um VSIX.Por exemplo, você poderia definir um único VSIX que inclui comandos para diagramas UML, uma linguagem específica do domínio e comandos de camada.

ObservaçãoObservação

Você também pode personalizar a validação de arquitetura, fonte de quais usuários de código é comparado com diagramas de camada.Você deve definir a validação de arquitetura em um separado Visual Studio projeto.Para adicioná-lo para o mesmo VSIX como outras extensões.Para mais informações, consulte Adicionar validação personalizada da arquitetura a diagramas de camada.

Requisitos para a criação de extensões de camada

Você deve ter instalado o seguinte no computador onde você deseja desenvolver suas extensões de camada:

  • Visual Studio Ultimate

  • Visual Studio SDK

  • SDK de modelagem e visualização

Definindo um gesto ou um comando em um novo VSIX

O método mais rápido de criar uma extensão é usar o modelo de projeto.Isso coloca o código e o manifesto VSIX no mesmo projeto.

Para definir uma extensão usando um modelo de projeto

  1. Criar um projeto em uma solução nova, usando o Um novo projeto comando o arquivo menu.

  2. No Novo projeto caixa de diálogo, em Projetos de modelagem, selecione Camada Designer comando extensão ou Camada Designer gesto extensão.

    O modelo cria um projeto que contém um pequeno exemplo de trabalho.

  3. Para testar a extensão, pressione CTRL + F5 ou F5.

    Uma instância experimental do Visual Studio inicia.Neste exemplo, crie um diagrama de camada.A extensão de comando ou gesto deve trabalhar neste diagrama.

  4. Feche a instância experimental e modificar o código de exemplo.Para mais informações, consulte Navegando e atualizar modelos de camada no código de programa.

  5. Você pode adicionar manipuladores de comando ou gesto mais no mesmo projeto.Para obter mais informações, consulte uma das seções a seguintes:

    Definindo um comando de Menu

    Definir um manipulador de gesto

  6. Para instalar a extensão na instância principal do Visual Studio, ou em outro computador, localize o .vsix de arquivo em bin\*.Copie-o para o computador onde você deseja instalá-lo e, em seguida, clique duas vezes.Para desinstalá-lo, use Extension Manager sobre o Ferramentas menu.

Adicionar um comando ou gesto a um VSIX separado

Se você deseja criar um VSIX que contém comandos, camada validadores e outras extensões, recomendamos que você criar um projeto para definir o VSIX e projetos separados para os manipuladores.Para obter informações sobre outros tipos de extensão de modelagem, consulte Diagramas e modelos UML estendendo.

Para adicionar extensões de camada um VSIX separado

  1. Criar uma biblioteca de classes do projeto em um novo ou existente Visual Studio Ultimate solução.No Novo projeto caixa de diálogo, clique em Visual C# e clique em Biblioteca de classe.Este projeto irá conter o comando ou gesto classes de manipulador.

    ObservaçãoObservação

    Você pode definir mais de uma classe de manipulador de comando ou gesto na biblioteca de uma classe, mas você deve definir as classes da camada de validação em uma biblioteca de classe separada.

  2. Identificar ou criar um projeto VSIX em sua solução.Um projeto VSIX contém um arquivo chamado source.extension.vsixmanifest.Para adicionar um projeto VSIX:

    1. No Novo projeto caixa de diálogo caixa, expanda Visual C#, clique extensibilidadee clique em VSIX projeto.

    2. No Solution Explorer, clique com o botão direito no projeto VSIX e clique em Set as Startup Project.

    3. Clique em Selecione edições e certifique-se de que Visual Studio Ultimate está marcada.

  3. Em source.extension.vsixmanifest, em ativos, adicione o comando ou gesto projeto manipulador como um componente do MEF.

    1. No ativos. TAB, escolha nova.

    2. Em tipo, selecione Microsoft.VisualStudio.MefComponent.

    3. Em origem, selecione projeto na solução atual e selecione o nome do seu projeto de manipulador de comando ou gesto.

    4. Salve o arquivo.

  4. Retornar ao projeto de manipulador de comando ou gesto e adicionar as seguintes referências de projeto.

Referência

O que isso permite que você faça

Programa de Programas\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Architecture Tools\ExtensibilityRuntime\Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll

Criar e editar camadas

Microsoft.VisualStudio.UML.interfaces

Criar e editar camadas

Microsoft.VisualStudio.ArchitectureTools.Extensibility

Modificar formas em diagramas

System.ComponentModel.Composition

Definir componentes usando Managed Extensibility Framework (MEF)

Microsoft.VisualStudio.Modeling.SDK.11.0

Definir as extensões de modelagem

Microsoft.VisualStudio.Modeling.SDK.Diagrams.11.0

Atualizar formas e diagramas

  1. Edite o arquivo de classe C# classe projeto da biblioteca para conter o código para a sua extensão.Para obter mais informações, consulte uma das seções a seguintes:

    Definindo um comando de Menu

    Definir um manipulador de gesto

    See also Navegando e atualizar modelos de camada no código de programa.

  2. Para testar o recurso, pressione CTRL + F5 ou F5.Uma instância experimental do Visual Studio abre.Nesta instância, crie ou abra um diagrama de camada.

  3. Para instalar o VSIX na instância principal do Visual Studio, ou em outro computador, localizar o .vsix arquivo de bin diretório do projeto VSIX.Copie-o para o computador onde você deseja instalar o VSIX.Clique duas vezes no arquivo VSIX no Windows Explorer (Explorador de arquivos no Windows 8).

    Para desinstalá-lo, use Extension Manager sobre o Ferramentas menu.

Definindo um comando de Menu

Você pode adicionar mais definições de comando de menu para um gesto existente ou um projeto de comando.Cada comando é definido por uma classe tem as seguintes características:

  • A classe é declarada da seguinte maneira:

    [LayerDesignerExtension]

    [Export(typeof(ICommandExtension))]

    public class MyLayerCommand : ICommandExtension { ... }

  • O namespace e o nome da classe não são importantes.

  • Os métodos que implementam ICommandExtension são como segue:

    • string Text {get;}-O rótulo que aparece no menu.

    • void QueryStatus(IMenuCommand command)-chamado quando o usuário clica com o botão direito no diagrama e determina se o comando deve ser visível e ativado para a seleção do usuário atual.

    • void Execute(IMenuCommand command)-chamado quando o usuário seleciona o comando.

  • Para determinar a seleção atual, você pode importar IDiagramContext:

    [Import]

    public IDiagramContext DiagramContext { get; set; }

    ...

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

Para mais informações, consulte Navegando e atualizar modelos de camada no código de programa.

Para adicionar um novo comando, crie um novo arquivo de código que contém o exemplo a seguir.Em seguida, testar e editá-lo.

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

Definir um manipulador de gesto

Um manipulador de gesto responde quando o usuário arrasta itens para o diagrama de camada e quando o usuário clica duas vezes em qualquer lugar no diagrama.

O comando existente ou projeto do gesto manipulador VSIX, você pode adicionar um arquivo de código que define um manipulador de gesto:

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 os seguintes pontos sobre manipuladores do gesto:

  • Os membros da IGestureExtension são como segue:

    OnDoubleClick -chamado quando o usuário clica duas vezes em qualquer lugar no diagrama.

    CanDragDrop - chamado repetidamente conforme o usuário move o mouse enquanto arrasta um item para o diagrama.Deve trabalhar rapidamente.

    OnDragDrop -chamado quando o usuário solta um item para o diagrama.

  • O primeiro argumento para cada método é um IShape, da qual você pode obter o elemento de camada.Por exemplo:

            public void OnDragDrop(IShape target, IDataObject data)
            {
                ILayerElement element = target.GetLayerElement();
                if (element is ILayer)
                {
                    // ...
                }
            }
    
  • Manipuladores para alguns tipos de item arrastado já estão definidos.Por exemplo, o usuário pode arrastar itens do Solution Explorer para um diagrama de camada.Você não pode definir um manipulador para esses tipos de item de arrastar.Nesses casos, o DragDrop métodos não serão invocados.

Para obter mais informações sobre como decodificar outros itens quando eles são arrastados para o diagrama, consulte Como: definir um manipulador de gesto em um diagrama de modelagem.

Consulte também

Conceitos

Navegando e atualizar modelos de camada no código de programa

Adicionar validação personalizada da arquitetura a diagramas de camada

Como: definir e instalar uma extensão de modelagem