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

Você pode permitir que um elemento a ser arrastadas para o outro, na caixa de ferramentas ou em uma operação de colar ou mover a operação.Você pode ter os elementos movidos vinculados aos elementos de destino, usando os relacionamentos que você especifica.

Uma diretiva de mesclagem de elemento (EMD) Especifica o que acontece quando um elemento de modelo é mescladas em outro elemento de modelo.Isso acontece quando:

  • O usuário arrasta da toolbox para o diagrama ou uma forma.

  • O usuário cria um elemento usando um menu Adicionar no explorer ou uma forma de compartimento.

  • O usuário move um item de uma raia para outro.

  • O usuário cola um elemento.

  • Seu código de programa chama a diretiva de mesclagem do elemento.

Embora as operações de criação podem parecer seja diferente do que as operações de cópia, eles realmente funcionam da mesma maneira.Quando um elemento é adicionado, por exemplo na caixa de ferramentas, um protótipo dela é duplicado.O protótipo é mesclado no modelo da mesma maneira como os elementos que foram copiados de outra parte do modelo.

A responsabilidade de um EMD é decidir como um objeto ou grupo de objetos deve ser mesclado em um local específico no modelo.Em particular, ele decide que relações devem ser instanciadas para vincular o grupo mesclado no modelo.Você também pode personalizá-lo para definir propriedades e criar objetos adicionais.

A função de uma diretiva de mesclagem de elemento

EMD_Merge DSL

Um EMD é gerado automaticamente quando você define um relacionamento de incorporação.Esse padrão EMD cria uma instância do relacionamento quando os usuários adicionam novas instâncias de filho para pai.Você pode modificar essas EMDs padrão, por exemplo, adicionando o código personalizado.

Você também pode adicionar seus próprio EMDs na definição de DSL, para permitir aos usuários arrasta ou cola combinações diferentes das classes mescladas e recebimento.

Definir uma diretiva de mesclagem do elemento

Você pode adicionar diretivas de mesclagem do elemento a classes de domínio, relações de domínios, conectores, formas e diagramas.Você pode adicionar ou encontrá-los no Explorer DSL sob a classe receptora do domínio.A classe de recepção é a classe de domínio do elemento que já está no modelo e, em que o elemento novo ou copiado será mesclado.

EMD_Details DSL

O Classe indexação é a classe de domínio de elementos que podem ser mescladas em membros da classe receptora.Instâncias das subclasses da classe de indexação também serão mescladas por este EMD, a menos que você defina aplica-se a subclasses como False.

Há dois tipos de diretiva de mesclagem:

  • A Processo de mesclagem diretiva especifica as relações pelo qual o novo elemento deve ser vinculado na árvore.

  • A Frente mesclar diretiva redireciona o novo elemento a outro elemento de recebimento, normalmente um pai.

Você pode adicionar código personalizado para mesclar as diretivas:

  • Definir personalizado usa aceitar para adicionar seu próprio código para determinar se uma determinada instância do elemento indexação deve ser mesclada no elemento de destino.Quando o usuário arrasta na caixa de ferramentas, o ponteiro "invalid" mostra se o seu código não permite a mesclagem.

    Por exemplo, você pode permitir que a mesclagem somente quando o elemento de recebimento estiver em um estado particular.

  • Definir usa a mesclagem personalizada para adicionar forneça próprio código para definir as alterações são feitas no modelo quando a mesclagem é executada.

    Por exemplo, você pode definir propriedades no elemento mesclado usando dados de sua nova localização no modelo.

ObservaçãoObservação

Se você escrever código personalizado de mesclagem, ela afeta somente mesclagens que são executadas usando este EMD.Se houver outros EMDs que mesclagem o mesmo tipo de objeto, ou se não houver outros códigos personalizados que cria esses objetos sem usar o EMD, em seguida, eles não serão afetados pelo seu código personalizado de mesclagem.

Se você desejar certificar-se de que um novo elemento ou um novo relacionamento sempre é processado pelo seu código personalizado, você poderá definir uma AddRule na relação de incorporação e um DeleteRule na classe de domínio do elemento.Para obter mais informações, consulte Regras de propagam alterações dentro do modelo.

Exemplo: Definindo um EMD sem código personalizado

O exemplo a seguir permite aos usuários criar um elemento e um conector ao mesmo tempo, arrastando do toolbox para uma forma existente.O exemplo adiciona um EMD à definição de DSL.Antes dessa modificação, os usuários podem arrastar de ferramentas para o diagrama, mas não em formas existentes.

Os usuários também podem colar elementos para outros elementos.

Para permitir aos usuários criar um elemento e um conector ao mesmo tempo

  1. Criar uma nova DSL usando o Mínimo idioma o modelo de solução.

    Quando você executa essa DSL, ele permite criar formas e conectores entre as formas.Não é possível arrastar uma nova ExampleElement a forma da toolbox para uma forma existente.

  2. Para permitir aos usuários mesclar elementos em ExampleElement formas, criar um novo EMD na ExampleElement a classe de domínio:

    1. Em Explorer DSL, expanda Classes de domínio.Com o botão direito ExampleElement e, em seguida, clique em Adicionar novo elemento mesclar diretiva.

    2. Certifique-se de que o DSL detalhes janela estiver aberta, para que você possa ver os detalhes sobre o novo EMD.(Menu: Exibir, outras janelas, DSL detalhes.)

  3. Definir o a classe de indexação na janela de detalhes de DSL, para definir a classe de elementos pode ser mesclada em ExampleElement objetos.

    Neste exemplo, selecione ExampleElements, de modo que o usuário pode arrastar novos elementos para os elementos existentes.

    Observe que a classe de indexação se torna o nome do EMD no Explorer DSL.

  4. Em mesclagem processo criando links, adicione dois caminhos:

    1. Um caminho vincula o novo elemento no modelo pai.A expressão de caminho que você precisa digitar navega do elemento existente, até por meio do relacionamento de incorporação para o modelo pai.Finalmente, ele especifica a função no novo link ao qual o novo elemento será atribuído.O caminho é o seguinte:

      ExampleModelHasElements.ExampleModel/!ExampleModel/.Elements

    2. O outro caminho vincula o novo elemento do elemento existente.A expressão de caminho Especifica a relação de referência e a função à qual o novo elemento será atribuído.Esse caminho é o seguinte:

      ExampleElementReferencesTargets.Sources

    Você pode usar a ferramenta de navegação do caminho para criar cada caminho:

    1. Em mesclagem processo criando vínculos nos caminhos, clique em < adicionar caminho >.

    2. Clique na seta suspensa à direita do item da lista.Um modo de exibição de árvore é exibida.

    3. Expanda os nós na árvore para formar o caminho que você deseja especificar.

  5. Teste o DSL:

    1. Pressione F5 para recriar e executar a solução.

      Reconstrução levará mais tempo do que o normal porque o código gerado será atualizado a partir de modelos de texto de acordo com a nova definição de DSL.

    2. Quando a instância experimental do Visual Studio foi iniciado, abra um arquivo de modelo de seu DSL.Crie alguns elementos de exemplo.

    3. Arraste a partir do Elemento de exemplo ferramenta em uma forma existente.

      Uma nova forma aparece e é vinculado à forma existente com um conector.

    4. Copie uma forma existente.Selecione outra forma e cole.

      Uma cópia da primeira forma é criada.Ele tem um novo nome e é vinculado à segunda forma com um conector.

Observe os seguintes pontos neste procedimento:

  • Criando diretivas de mesclagem do elemento, você pode permitir que qualquer classe de elemento para aceitar qualquer outro.O EMD é criado na classe de domínio de recebimento, e a classe de domínio aceito é especificada na classe índice campo.

  • Definindo os caminhos, você pode especificar quais links deve ser usado para conectar o novo elemento ao modelo existente.

    Os links que você especificar deve incluir uma relação de incorporação.

  • O EMD afeta a criação da caixa de ferramentas e também operações de colagem.

    Se você escrever código personalizado que cria novos elementos, você pode chamar explicitamente o EMD usando o ElementOperations.Merge método.Isso garante que seu código vincula novos elementos para o modelo da mesma forma como outras operações.Para obter mais informações, consulte Personalizar o comportamento de cópia.

Exemplo: Adicionando o código personalizado aceitar a um EMD

Adicionando o código personalizado para um EMD, você pode definir o comportamento de junção mais complexo.Esse exemplo simples impede que o usuário adicionando mais de um número fixo de elementos no diagrama.O exemplo modifica o padrão EMD que acompanha um relacionamento de incorporação.

Escrever código personalizado aceitar para restringir o que o usuário pode adicionar.

  1. Criar uma DSL usando o Mínimo idioma o modelo de solução.Abra o diagrama de definição de DSL.

  2. No Explorer DSL, expanda Classes de domínio, ExampleModel, Elemento mesclar diretivas.Selecione a diretiva de mesclagem do elemento chamado ExampleElement.

    Este EMD controla como o usuário pode criar novos ExampleElement objetos do modelo, por exemplo, arrastando do toolbox.

  3. No DSL detalhes janela, selecione usa personalizada aceita.

  4. Recrie a solução.Isso levará mais tempo porque o código gerado será atualizado a partir do modelo.

    Um erro de compilação serão relatados, semelhante a: "Company.ElementMergeSample.ExampleElement não contém uma definição para CanMergeExampleElement…"

    Você deve implementar o método CanMergeExampleElement.

  5. Criar um novo arquivo de código na Dsl project.Substitua o seu conteúdo com o seguinte código e alterar o namespace ao namespace do seu projeto.

    using Microsoft.VisualStudio.Modeling;
    
    namespace Company.ElementMergeSample // EDIT.
    {
      partial class ExampleModel
      {
        /// <summary>
        /// Called whenever an ExampleElement is to be merged into this ExampleModel.
        /// This happens when the user pastes an ExampleElement
        /// or drags from the toolbox.
        /// Determines whether the merge is allowed.
        /// </summary>
        /// <param name="rootElement">The root element in the merging EGP.</param>
        /// <param name="elementGroupPrototype">The EGP that the user wants to merge.</param>
        /// <returns>True if the merge is allowed</returns>
        private bool CanMergeExampleElement(ProtoElementBase rootElement, ElementGroupPrototype elementGroupPrototype)
        {
          // Allow no more than 4 elements to be added:
          return this.Elements.Count < 4;
        }
      }
    }
    

    Esse exemplo simples restringe o número de elementos que podem ser mesclados no modelo de pai.Nas condições mais interessantes, o método pode inspecionar a qualquer uma das propriedades e os links do objeto receptor.Ele também pode inspecionar as propriedades dos elementos mesclagem, que são carregados em um ElementGroupPrototype.Para obter mais informações sobre o ElementGroupPrototypes, consulte Personalizar o comportamento de cópia.Para obter mais informações sobre como escrever código que lê um modelo, consulte Navegando e atualizando um modelo de código de programa.

  6. Teste o DSL:

    1. Pressione F5 para recriar a solução.Quando a instância experimental do Visual Studio será aberta, abrir uma instância de seu DSL.

    2. Crie novos elementos de várias maneiras:

      1. Arraste a partir do Elemento de exemplo ferramenta para o diagrama.

      2. No Gerenciador de modelos de exemplo, o botão direito do mouse no nó raiz e, em seguida, clique em Adicionar novo elemento de exemplo.

      3. Copie e cole um elemento no diagrama.

    3. Verifique se você não pode usar qualquer uma dessas maneiras para adicionar mais de quatro elementos ao modelo.Isso ocorre porque todos eles usam a diretiva de mesclagem de elemento.

Exemplo: Adicionando código personalizado de mesclagem para um EMD

No código de mesclagem personalizados, você pode definir o que acontece quando o usuário arrasta uma ferramenta ou cola em um elemento.Há duas maneiras para definir uma mesclagem personalizada:

  1. Definir Usa o Custom mesclar e forneça o código necessário.O código substitui o código gerado de mesclagem.Use esta opção se você deseja redefinir completamente o que faz a mesclagem.

  2. Substituir o MergeRelate método e, opcionalmente, o MergeDisconnect método.Para fazer isso, você deve definir o Gera Double derivado propriedade da classe de domínio.Seu código pode chamar o código gerado de mesclagem na classe base.Use esta opção se você quiser executar operações adicionais após a mesclagem foi realizada.

Essas abordagens afetam somente mesclagens que são executadas usando este EMD.Se você deseja afetar todas as maneiras em que o elemento mesclado pode ser criado, uma alternativa é definir um AddRule na relação de incorporação e um DeleteRule na classe de domínio mescladas.Para obter mais informações, consulte Regras de propagam alterações dentro do modelo.

Para substituir o MergeRelate

  1. A definição de DSL, certifique-se de que você tenha definido o EMD ao qual você deseja adicionar o código.Se desejar, você pode adicionar caminhos e definir personalizado aceitar o código, conforme descrito nas seções anteriores.

  2. No diagrama de DslDefinition, selecione a classe receptora da mesclagem.Geralmente é a classe na extremidade de origem de uma relação de incorporação.

    Por exemplo, uma DSL gerada a partir da solução de idioma mínima, selecione ExampleModel.

  3. No Propriedades janela, defina Gera Double derivado para true.

  4. Recrie a solução.

  5. Inspecionar o conteúdo do Dsl\Generated Files\DomainClasses.cs.Procurar por métodos chamados MergeRelate e examine seu conteúdo.Isso irá ajudá-lo a escrever suas próprias versões.

  6. Em um novo arquivo de código, escrever uma classe parcial para a classe de recebimento e substituem o MergeRelate método.Lembre-se de chamar o método base.Por exemplo:

      partial class ExampleModel
      {
        /// <summary>
        /// Called when the user drags or pastes an ExampleElement onto the diagram.
        /// Sets the time of day as the name.
        /// </summary>
        /// <param name="sourceElement">Element to be added</param>
        /// <param name="elementGroup">Elements to be merged</param>
        protected override void MergeRelate(ModelElement sourceElement, ElementGroup elementGroup)
        {
          // Connect the element according to the EMD:
          base.MergeRelate(sourceElement, elementGroup);
    
          // Custom actions: 
          ExampleElement mergingElement = sourceElement as ExampleElement;
          if (mergingElement != null)
          {
            mergingElement.Name = DateTime.Now.ToLongTimeString();
          }
        }
      }
    

Escrever código personalizado mesclar

  1. Na Dsl\Generated Code\DomainClasses.cs, inspecione os métodos chamados MergeRelate.Esses métodos criam vínculos entre o modelo existente e de um novo elemento.

    Além disso, inspecione métodos chamados MergeDisconnect.Esses métodos desvincular um elemento do modelo quando ele estiver a ser excluído.

  2. Em Explorer DSL, selecione ou crie a diretiva de mesclagem de elemento que você deseja personalizar.No DSL detalhes janela, defina Usa o Custom mesclar.

    Quando você definir essa opção, o Processo de mesclagem e Frente mesclar opções serão ignoradas.Seu código será usado.

  3. Recrie a solução.Levará mais tempo do que o normal porque os arquivos de código gerado serão atualizados a partir do modelo.

    Mensagens de erro serão exibida.Clique duas vezes as mensagens de erro para ver as instruções no código gerado.Estas instruções pedir que você forneça os dois métodos, MergeRelateYourDomainClass e MergeDisconnectYourDomainClass

  4. Os métodos de gravação em uma definição de classe parcial em um arquivo de código separados.Os exemplos que você anteriormente inspecionados devem sugerir que você precisa.

Código personalizado de mesclagem não afetará o código que cria objetos e relações diretamente e não afetará outros EMDs.Para certificar-se de que as alterações adicionais são implementadas, independentemente de como o elemento é criado, considere escrever uma AddRule e um DeleteRule em vez disso.Para obter mais informações, consulte Regras de propagam alterações dentro do modelo.

Redirecionando a uma operação de mesclagem

Uma diretiva de mesclagem direta redireciona o destino de uma operação de mesclagem.Normalmente, o novo destino é o pai de incorporação do destino inicial.

Por exemplo, uma DSL que foi criada com o modelo de diagrama de componente, as portas são incorporadas nos componentes.As portas são exibidas como pequenas formas na borda de uma forma componente.O usuário cria portas, arrastando a ferramenta de porta para uma forma componente.Mas, às vezes, o usuário arrasta por engano a ferramenta de porta para uma porta existente, em vez do componente, e a operação falhará.Este é um engano fácil quando houver várias portas existentes.Para ajudar o usuário para evitar esse inconveniente, você pode permitir que as portas para ser arrastadas para uma porta existente, mas a ação redirecionado para o componente pai.A operação funciona como se o elemento de destino foram o componente.

Você pode criar uma diretiva de mesclagem direta da solução de modelo de componente.Se você compilar e executa a solução original, você verá que os usuários podem arrastar qualquer número de A porta de entrada ou Porta de saída elementos a partir de Toolbox para um componente elemento.No entanto, eles não é possível arrastar uma porta para uma porta existente.Os alertas do ponteiro não está disponível-los de que essa mudança não está habilitados.Entretanto, você pode criar uma diretiva direta de mesclagem para que uma porta que seja acidentalmente soltos em uma existente A porta de entrada é encaminhado para o componente elemento.

Para criar uma diretiva de encaminhamento de mesclagem

  1. Criar um Ferramentas de Linguagem Específica do Domínio solução usando o modelo de componente modelo.

  2. Exibição de Explorer DSL , abrindo o DslDefinition.dsl.

  3. No Explorer DSL, expanda Classes de domínio.

  4. O ComponentPort classe abstrata do domínio é a classe base de ambos InPort e OutPort.Com o botão direito ComponentPort e, em seguida, clique em Adicionar novo elemento mesclar diretiva.

    Uma nova Elemento mesclar diretiva nó aparece sob o Elemento mesclar diretivas nó.

  5. Selecione o Elemento mesclar diretiva nó e abrir o DSL detalhes janela.

  6. Na lista de classe de indexação, selecione ComponentPort.

  7. Selecione Encaminhar Mesclar para uma classe de domínio diferente.

  8. Na lista de seleção de caminho, expanda ComponentPort, expanda ComponentHasPortse selecione componente.

    O novo caminho deverá ser semelhante a esta:

    ComponentHasPorts.Component/!Componente

  9. Salve a solução e, em seguida, transformar os modelos clicando no botão mais à direita no Solution Explorer barra de ferramentas.

  10. Compile e execute a solução.Uma nova instância do Visual Studio é exibida.

  11. Em Solution Explorer, abra Sample.mydsl.O diagrama e o Caixa de ferramentas do ComponentLanguage aparecer.

  12. Arrastar um A porta de entrada da caixa de ferramentas para outra Porta de entrada. Em seguida, arraste um OutputPort para um InputPort e, em seguida, com outro OutputPort.

    Você não deve ver o ponteiro não está disponível e você poderá descartar o novo A porta de entrada em uma existente.Selecione o novo A porta de entrada e arrastá-lo para outro ponto de componente.

Consulte também

Conceitos

Navegando e atualizando um modelo de código de programa

Personalizando as ferramentas e a caixa de ferramentas.

Outros recursos

Diagramas de circuito DSL de exemplo