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çã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
Criar um projeto em uma solução nova, usando o Um novo projeto comando o arquivo menu.
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.
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.
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.
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
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
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çã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.
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:
No Novo projeto caixa de diálogo caixa, expanda Visual C#, clique extensibilidadee clique em VSIX projeto.
No Solution Explorer, clique com o botão direito no projeto VSIX e clique em Set as Startup Project.
Clique em Selecione edições e certifique-se de que Visual Studio Ultimate está marcada.
Em source.extension.vsixmanifest, em ativos, adicione o comando ou gesto projeto manipulador como um componente do MEF.
No ativos. TAB, escolha nova.
Em tipo, selecione Microsoft.VisualStudio.MefComponent.
Em origem, selecione projeto na solução atual e selecione o nome do seu projeto de manipulador de comando ou gesto.
Salve o arquivo.
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 |
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.
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.
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