Personalizando as ferramentas e a caixa de ferramentas.

Você deve definir os itens da caixa de ferramentas para os elementos que você deseja permitir que os usuários a adicionar a seus modelos.Há dois tipos de ferramentas: ferramentas de elemento e conexão.No designer gerado, um usuário pode selecionar uma ferramenta de elemento para arrastar formas no diagrama e pode selecionar uma ferramenta para desenhar os links entre as formas de conexão.Em geral, ferramentas de elemento permitem aos usuários adicionar instâncias de classes de domínio para seus modelos e ferramentas de conexão permitem a adicionar instâncias de relações entre domínios.

Neste tópico:

  • Modificando as guias da caixa de ferramentas

  • Ferramentas de elemento

  • A criação de grupos de elementos de uma ferramenta

  • Ferramentas de conexão

  • Alterando a ordem dos itens da caixa de ferramentas

Como a caixa de ferramentas é definida

No Explorer DSL, expanda o nó do Editor e os nós abaixo dele.Normalmente, você verá uma hierarquia que se pareça com:

Editor
     Toobox Tabs
        MyDsl          //a tab
           Tools
               ExampleElement      // an element tool
               ExampleRelationship // a connection tool

Nesta parte do Explorer DSL, você pode:

  • Crie novas guias.As tabulações definem os títulos de seção na caixa de ferramentas.

  • Crie novas ferramentas.

  • Copie e cole as ferramentas.

  • Mova as ferramentas para cima ou para baixo na lista.

  • Exclua guias e ferramentas.

Observação importanteImportante

Para adicionar ou colar itens em um Explorer DSL, o botão direito do mouse o avô do novo nó.Por exemplo, para adicionar uma ferramenta, botão direito do mouse na guia e não o Ferramentas nó.Para adicionar uma guia, clique com o botão direito do Editor nó.

O Ícone da caixa de ferramentas a propriedade de cada ferramenta faz referência a um arquivo de bitmap de 16 x 16.Geralmente, esses arquivos são mantidos na Dsl\Resources pasta.

O classe propriedade de uma ferramenta de elemento se refere a uma classe concreta do domínio.Por padrão, a ferramenta irá criar instâncias dessa classe.No entanto, você pode escrever código para que a ferramenta para criar grupos de elementos ou elementos de tipos diferentes.

O Builder conexão a propriedade de uma ferramenta de conexão se refere a um construtor de conexão, que define quais os tipos de elementos a ferramenta pode se conectar e que relações cria entre eles.Os desenvolvedores de conexão são definidos como nós no Gerenciador de DSL.Os desenvolvedores de conexão são criados automaticamente quando você definir relacionamentos de domínio, mas você pode escrever código para personalizá-los.

Para adicionar uma ferramenta para a caixa de ferramentas.

  1. Geralmente, você cria uma ferramenta de elemento depois de ter criado uma classe shape e mapeados-lo para uma classe de domínio.

    Geralmente, você cria uma ferramenta de conector depois de ter criado uma classe de conector e mapeados-lo para uma relação de referência.

  2. No Explorer DSL, expanda o Editor nó e o Toolbox Tabs nó.

    Um nó de guia da caixa de ferramentas com o botão direito e clique em Adicionar uma nova ferramenta de elemento ou Adicionar uma nova ferramenta de conexão.

  3. Definir o Ícone da caixa de ferramentas propriedade para fazer referência a um bitmap de 16 x 16.

    Se você quiser definir um novo ícone, crie um arquivo bitmap no Solution Explorer na Dsl\Resources pasta.O arquivo deve ter os seguintes valores de propriedade: Build Action = conteúdo; Copy to Output Directory = não copie.

  4. Para uma ferramenta de elemento: definir o classe propriedade da ferramenta para se referir a uma classe concreta de domínio que é mapeada para uma forma.

    Para uma ferramenta de conector: definir o Builder conexão propriedade da ferramenta para um dos itens que são oferecidos na lista suspensa.Os desenvolvedores de conexão são criados automaticamente quando você mapeia um conector para uma relação de domínio.Se você criou recentemente um conector, normalmente você selecionaria o construtor de conexão associado.

  5. Para testar a DSL, pressione F5 ou CTRL + F5 e na instância experimental do Visual Studio, abra um arquivo de modelo de exemplo.A nova ferramenta deve aparecer na caixa de ferramentas.Arraste-o para o diagrama para verificar que ele cria um novo elemento.

    Se a ferramenta não aparecer, pare o experimental Visual Studio.No Windows Iniciar menu, execute Redefinir a Microsoft Visual Studio 2010 Experimental instância.Sobre o Visual StudioBuild menu, clique em Rebuild Solution.Teste o DSL novamente.

Personalizando as ferramentas de elemento

Por padrão, a ferramenta irá criar uma única instância da classe especificada, mas isso pode variar de duas maneiras:

  • Defina diretivas de mesclagem do elemento em outras classes, permitindo que eles aceitar novas instâncias dessa classe e permitindo que eles criem links adicionais quando o novo elemento é criado.Por exemplo, você poderia permitir que o usuário solta um comentário em outro elemento e, assim, criar um link de referência entre os dois.

    Essas personalizações também afetam o que acontece quando o usuário cola ou arrasta e solta um elemento.

    Para obter mais informações, consulte Personalizando a movimentação e criação de elemento.

  • Escreva código para personalizar a ferramenta para que ele possa criar grupos de elementos.A ferramenta é inicializada por métodos em ToolboxHelper.cs que podem ser substituídos.Para obter mais informações, consulte Criando grupos de elementos de uma ferramenta de.

Bb126279.collapse_all(pt-br,VS.110).gifA criação de grupos de elementos de uma ferramenta

Cada ferramenta de elemento contém um protótipo dos elementos que ele deve criar.Por padrão, cada ferramenta elemento cria um único elemento, mas também é possível criar um grupo de objetos relacionados com uma ferramenta.Para fazer isso, você pode inicializar a ferramenta com um ElementGroupPrototype que contém os itens relacionados.

O exemplo a seguir é tirado de uma DSL no qual há um tipo de Transistor.Cada Transistor tem três terminais nomeados.A ferramenta de elemento para transistores armazena um protótipo que contém quatro elementos de modelo e três links de relacionamento.Quando o usuário arrasta a ferramenta para o diagrama, o protótipo é instanciado e relacionado à raiz do modelo.

Esse código substitui um método definido em Dsl\GeneratedCode\ToolboxHelper.cs.

Para obter mais informações sobre como personalizar o modelo usando o código de programa, consulte Navegando e atualizando um modelo de código de programa.

using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;

  public partial class CircuitsToolboxHelper
  {
    /// <summary>
    /// Toolbox initialization, called for each element tool on the toolbox.
    /// This version deals with each Component subtype separately.
    /// </summary>
    /// <param name="store"></param>
    /// <param name="domainClassId">Identifies the domain class this tool should instantiate.</param>
    /// <returns>prototype of the object or group of objects to be created by tool</returns>
    protected override ElementGroupPrototype CreateElementToolPrototype(Store store, Guid domainClassId)
    {
        if (domainClassId == Transistor.DomainClassId)
        {
            Transistor transistor = new Transistor(store);

            transistor.Base = new ComponentTerminal(store);
            transistor.Collector = new ComponentTerminal(store);
            transistor.Emitter = new ComponentTerminal(store);

            transistor.Base.Name = "base";
            transistor.Collector.Name = "collector";
            transistor.Emitter.Name = "emitter";

            // Create an ElementGroup for the Toolbox.
            ElementGroup elementGroup = new ElementGroup(store.DefaultPartition);
            elementGroup.AddGraph(transistor, true);
            // AddGraph includes the embedded parts

            return elementGroup.CreatePrototype();
        }
        else
        {
            return base.CreateElementToolPrototype(store, domainClassId);
}  }    }

Personalizando as ferramentas de conexão

Geralmente, você cria uma ferramenta do elemento quando você cria uma nova classe de conector.Como alternativa, você pode sobrecarregar uma ferramenta, permitindo que os tipos de duas extremidades para determinar o tipo de relacionamento.Por exemplo, você poderia definir uma ferramenta de conexão que pode criar relações de pessoa a pessoa e de relacionamentos de cidade de pessoa.

Ferramentas de conexão chamam construtores de conexão.Use os construtores de conexão para especificar como os usuários podem vincular elementos no designer gerado.Os desenvolvedores de conexão especificam os elementos que podem ser vinculados e o tipo de link é criado entre eles.

Quando você cria uma relação de referência entre classes de domínio, um construtor de conexão é criado automaticamente.Você pode usar esse construtor de conexão quando você mapeia uma ferramenta de conexão.Para obter mais informações sobre como criar ferramentas de conexão, consulte Personalizando as ferramentas e a caixa de ferramentas..

Você pode modificar o construtor de conexão padrão para que ele possa lidar com uma variedade de diferente tipos de origem e destino e criar diferentes tipos de relacionamento.

Você também pode escrever código personalizado para os desenvolvedores de conexão especificar as classes de origem e de destino para a conexão, definir o tipo de conexão sejam feitas e realizar outras ações associadas com a criação de uma conexão.

Bb126279.collapse_all(pt-br,VS.110).gifA estrutura de construtores de conexão

Os desenvolvedores de conexão contenham uma ou mais links de diretivas, que especificam a relação de domínio e os elementos de origem e de destino se conectar.Por exemplo, no modelo de solução de fluxo de tarefas, você pode ver o CommentReferencesSubjectsBuilder na Explorer DSL.Este construtor de conexão contém um link de conectar-se a diretriz chamada CommentReferencesSubjects, que é mapeado para a relação de domínio CommentReferencesSubjects.Este link conectar-se diretiva contém uma diretiva de função de origem que aponta para o Comment a classe de domínio e uma diretiva de função de destino que aponta para o FlowElement a classe de domínio.

Bb126279.collapse_all(pt-br,VS.110).gifUsando conexão construtores para restringir a origem e funções de destino

Você pode utilizar construtores de conexão para restringir a ocorrência de determinadas classes em função de origem ou a função de destino de uma relação de domínio indicado.Por exemplo, você pode ter uma classe de base do domínio que tenha uma relação de domínio para outra classe de domínio, mas não é aconselhável todas as classes derivadas da classe base para ter as mesmas funções nessa relação.A solução de fluxo de tarefas, há quatro classes de domínio concreta (StartPoint, ponto de extremidade, MergeBranch e sincronização) que herda diretamente da classe abstrata do domínio FlowElement e duas classes de domínio concreta (tarefa e ObjectInState) que herdam indiretamente dele.Também há uma relação de referência de fluxo que leva o FlowElement classes de domínio em sua função de origem e a função de destino.No entanto, uma instância de uma classe de domínio do ponto de extremidade não deve ser a origem de uma instância de um relacionamento de fluxo, nem deve ser de uma instância de uma classe StartPoint o destino de uma instância de um relacionamento de fluxo.O construtor de FlowBuilder de conexão tem um link conectar-se a diretriz chamada fluxo que especifica qual domínio classes podem reproduzir a função de origem (tarefa, MergeBranch, StartPoint e sincronização) e que pode desempenhar a função de destino (MergeBranch, ponto de extremidade e sincronização).

Você pode adicionar mais de um link conectar-se a diretiva para um construtor de conexão.Isso pode ajudar a ocultar algumas das complexidades de modelo de domínio dos usuários e manter o caixa de ferramentas fique muito congestionado.Você pode adicionar um link conectar-se diretivas para várias relações de domínio diferente para o construtor de um única conexão.No entanto, você deve combinar relações de domínio quando eles realizam aproximadamente a mesma função.

Na solução de fluxo de tarefas, a ferramenta de conexão de fluxo é usada para desenhar a ocorrências de fluxo e as relações de domínio de FluxoObjeto.O FlowBuilder construtor de conexão tem, com o link de fluxo conectar diretiva descrita anteriormente, o link dois conectar-se diretivas chamadas FluxoObjeto.Essas diretivas especificam que uma instância de uma relação de FluxoObjeto pode ser desenhada entre as instâncias da classe de domínio ObjectInState, ou a partir de uma instância de um ObjectInState a uma instância de uma tarefa, mas não entre duas instâncias de uma tarefa ou uma instância de uma tarefa a uma instância de um ObjectInState.No entanto, uma instância de um relacionamento de fluxo pode ser desenhada entre duas instâncias de uma tarefa.Se você compilar e executa a solução de fluxo de tarefas, você pode ver que o desenho de um fluxo de uma instância de um ObjectInState para uma instância de uma tarefa cria uma instância de um FluxoObjeto, mas um fluxo de desenho entre duas instâncias de uma tarefa cria uma instância de fluxo.

Bb126279.collapse_all(pt-br,VS.110).gifCódigo personalizado para os desenvolvedores de conexão

Há quatro caixas na interface do usuário que definem os diferentes tipos de personalização de construtores de conexão:

  • o personalizada aceitar caixa de seleção em uma diretiva de função de origem ou destino

  • o de conexão personalizada caixa de seleção em uma diretiva de função de origem ou destino

  • o usa conectar personalizado caixa de seleção em uma diretiva de conectar

  • o Personalizada É propriedade do construtor de conexão

Você deve fornecer um código de programa para tornar essas personalizações.Para descobrir o que o código que você deve fornecer, verificar uma dessas caixas, clique transformar todos os modelos e, em seguida, desenvolver sua solução.Isso resultará em um relatório de erros.Clique duas vezes o relatório de erros para ver um comentário que explica o que o código, que você deve adicionar.

ObservaçãoObservação

Para adicionar o código personalizado, crie uma definição de classe parcial em um arquivo de código separados dos arquivos de código nas pastas GeneratedCode.Para evitar a perda do trabalho, você não deve editar os arquivos de código gerado.Para obter mais informações, consulte Substituindo e estendendo as Classes geradas.

Bb126279.collapse_all(pt-br,VS.110).gifCriação de código de conexão personalizada

Em cada link conectar diretiva, o as diretivas de função de origem guia define de que tipos que você podem arrastar.Da mesma forma, o as diretivas de função de destino guia define para quais tipos que você podem arrastar.Para cada tipo, você ainda pode especificar se deseja permitir a conexão (para que o link de conectar-se a diretiva), definindo a Personalizada aceitar flag e, em seguida, fornecer o código extra.

Você também pode personalizar o que ocorre quando a conexão é feita.Por exemplo, você pode personalizar apenas o caso em que o arrasto ocorre ou para uma determinada classe, todos os casos que um link conectar-se diretiva controla, ou o construtor de conexão FlowBuilder inteiro.Para cada uma dessas opções, você pode definir sinalizadores personalizados no nível apropriado.Quando você transformar todos os modelos e tenta criar a solução, as mensagens de erro direcioná-lo para comentários no código gerado.Esses comentários o identificam você deve fornecer.

No exemplo de diagrama de componentes, o construtor de conexão para a relação de domínio de conexão é personalizado para restringir as conexões que podem ser feitas entre as portas.A ilustração a seguir mostra o que você pode fazer conexões somente de OutPort elementos para InPort elementos, mas você pode aninhar componentes dentro de si.

Conexão, chegando a uma OutPort de um componente aninhado

Construtor de conexão

Portanto, convém especificar que uma conexão pode vir de um componente aninhado para um OutPort.Para especificar uma conexão, você definir Usa o Custom aceitar na InPort tipo como função de origem e o OutPort tipo como função de destino no DSL detalhes janela conforme mostrado nas ilustrações a seguir:

Link conectar-se a diretiva no Explorer DSL

Imagem do construtor de conexão

Link conectar-se a diretiva na janela de detalhes DSL

Bb126279.ConnectionBuilder_4b(pt-br,VS.110).png

Em seguida, você deve fornecer métodos na classe ConnectionBuilder:

  public partial class ConnectionBuilder
  {
    /// <summary>
    /// OK if this component has children
    /// </summary>
    private static bool CanAcceptInPortAsSource(InPort candidate)
    {
       return candidate.Component.Children.Count > 0;
    }

    /// <summary>
    /// Only if source is on parent of target.
    /// </summary>
    private static bool CanAcceptInPortAndInPortAsSourceAndTarget                (InPort sourceInPort, InPort targetInPort)
    {
      return sourceInPort.Component == targetInPort.Component.Parent;
    }
// And similar for OutPorts…

Para obter mais informações sobre como personalizar o modelo usando o código de programa, consulte Navegando e atualizando um modelo de código de programa.

Você pode usar código semelhante, por exemplo, para impedir a criação de loops com links pai-filho.Essas restrições são consideradas restrições 'disco rígidas' porque os usuários não podem violar a qualquer momento.Você também pode criar verificações de validação 'suave' que os usuários podem ignorar temporariamente, criando configurações inválidas que eles não podem ser salvos.

Bb126279.collapse_all(pt-br,VS.110).gifUma boa prática definir construtores de conexão

Você deve definir um construtor de conexão para criar diferentes tipos de relações, somente se eles são conceitualmente relacionados.No exemplo de fluxo de tarefas, você pode usar o construtor de mesmo criar fluxos entre tarefas e também entre as tarefas e objetos.No entanto, seria confuso usar o construtor mesmo criar relações entre tarefas e comentários.

Se você definir um construtor de conexão para vários tipos de relacionamentos, você deve garantir que ele não pode corresponder a mais de um tipo do mesmo par de objetos de origem e de destino.Caso contrário, os resultados serão imprevisíveis.

Use o código personalizado para aplicar restrições 'disco rígidas', mas você deve considerar se os usuários devem poder tornar temporariamente conexões inválidos.Se eles devem, você pode modificar as restrições para que as conexões não são validadas até os usuários tentam salvar alterações.

Consulte também

Conceitos

Personalizando a movimentação e criação de elemento

Personalizar o comportamento de cópia

Como: adicionar um manipulador de arrastar-e-soltar

Navegando e atualizando um modelo de código de programa

Outros recursos

Diagramas de circuito DSL de exemplo