Partilhar via


Como modificar um comando de menu padrão em uma linguagem específica do domínio

É possível modificar o comportamento de alguns dos comandos padrão que são definidos automaticamente na DSL. Por exemplo, é possível modificar Recortar para excluir informações confidenciais. Para isso, substitua métodos em uma classe de conjunto de comandos. Essas classes são definidas no arquivo CommandSet.cs, no projeto DslPackage e são derivadas de CommandSet.

Em resumo, para modificar um comando:

  1. Descubra quais comandos podem ser modificados.

  2. Crie uma declaração parcial da classe de conjunto de comandos adequada.

  3. Substitua os métodos ProcessOnStatus e ProcessOnMenu do comando.

Este tópico explica esse procedimento.

Dica

Se desejar criar seus próprios comandos de menu, consulte Como adicionar um comando ao menu de atalho.

Quais comandos podem ser modificados?

Para descobrir quais comandos podem ser modificados

  1. No projeto DslPackage, abra GeneratedCode\CommandSet.cs. Esse arquivo C# pode ser encontrado no Gerenciador de Soluções como uma subsidiária de CommandSet.tt.

  2. Encontre classes nesse arquivo cujos nomes terminem com "CommandSet", por exemplo Language1CommandSet e Language1ClipboardCommandSet.

  3. Em cada classe de conjunto de comandos, digite "override" seguido por um espaço. O IntelliSense mostrará uma lista dos métodos que podem ser substituídos. Cada comando contém um par de métodos cujos nomes começam com "ProcessOnStatus" e "ProcessOnMenu".

  4. Observe qual das classes de conjunto de comandos contém o comando que deseja modificar.

  5. Feche o arquivo sem salvar as edições.

    Dica

    Normalmente, é aconselhável não editar arquivos que foram gerados.Qualquer edição será perdida na próxima vez em que os arquivos forem gerados.

Estenda a classe de conjunto de comandos adequada

Crie um novo arquivo que contenha uma declaração parcial da classe de conjunto de comandos.

Estender a classe de Conjunto de Comandos

  1. No Gerenciador de Soluções, no projeto DslPackage, abra a pasta GeneratedCode e procure sob CommandSet.tt e abra o arquivo gerado CommandSet.cs. Observe o namespace e o nome da primeira classe que está definida lá. Por exemplo, é possível ver:

    namespace Company.Language1

    { ... internal partial class Language1CommandSet : ...

  2. Em DslPackage, crie uma pasta nomeada Código Personalizado. Nessa pasta, crie um novo arquivo de classe nomeado CommandSet.cs.

  3. No novo arquivo, grave uma declaração parcial que contenha o mesmo namespace e o nome que a classe parcial gerada. Por exemplo:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.Design;
    namespace Company.Language1 /* Make sure this is correct */
    { internal partial class Language1CommandSet { ...
    

    Nota   Se o modelo de arquivo de classe foi usado para criar o novo arquivo, é necessário corrigir o namespace e o nome da classe.

Substitua os métodos de comando

A maioria dos comandos contém dois métodos associados: O método com nome como ProcessOnStatus... determinada se o comando deve estar visível e habilitado. É chamado sempre que o usuário clicar com o botão direito do mouse no diagrama e deve ser executado rapidamente e não realizar alterações. ProcessOnMenu... é chamado quando o usuário clicar no comando e, deve realizar a função do comando. É possível substituir qualquer um dos métodos ou os dois.

Para alterar quando o comando é exibido em um menu

Substitua o método ProcessOnStatus... Esse método deve definir as propriedades Visível e Habilitado de seu parâmetro MenuCommand. Geralmente, o comando examina this.CurrentSelection para determinar se o comando é aplicável aos elementos selecionados e também poderá examinar suas propriedades para determinar se o comando pode ser aplicado em seu estado atual.

Como guia geral, a propriedade Visível deve ser determinada por quais elementos estão selecionados. A propriedade Habilitado, que determina se o comando é exibido em preto ou cinza no menu, deve depender do estado atual da seleção.

O exemplo a seguir desabilita o item de menu Excluir quando o usuário selecionar mais de uma forma.

Dica

Esse método não afeta se o comando está disponível através de um pressionamento de tecla.Por exemplo, desabilitar o item de menu Excluir não impede a invocação do comando através da tecla Delete.

/// <summary>
/// Called when user right-clicks on the diagram or clicks the Edit menu.
/// </summary>
/// <param name="command">Set Visible and Enabled properties.</param>
protected override void ProcessOnStatusDeleteCommand (MenuCommand command)
{
  // Default settings from the base method.
  base.ProcessOnStatusDeleteCommand(command);
  if (this.CurrentSelection.Count > 1)
  {
    // If user has selected more than one item, Delete is greyed out.
    command.Enabled = false;
  }
}

É uma boa prática chamar primeiro o método base, para lidar com todos os casos e as configurações pelos quais não houver interesse.

O método ProcessOnStatus não deve criar, excluir ou atualizar elementos no Armazenamento.

Para alterar o comportamento do comando

Substitua o método ProcessOnMenu... O exemplo a seguir impede o usuário de excluir mais de um elemento de cada vez, mesmo usando a tecla Delete.

/// <summary>
/// Called when user presses Delete key 
/// or clicks the Delete command on a menu.
/// </summary>
protected override void ProcessOnMenuDeleteCommand()
{
  // Allow users to delete only one thing at a time.
  if (this.CurrentSelection.Count <= 1)
  {
    base.ProcessOnMenuDeleteCommand();
  }
}

Se o código fizer alterações ao Armazenamento, como criar, excluir ou atualizar elementos ou links, será necessário fazer isso dentro de uma transação. Para obter mais informações, consulte Como modificar um comando de menu padrão em uma linguagem específica do domínio.

Gravando o código dos métodos

Os seguintes fragmentos são úteis com frequência dentro desses métodos:

  • this.CurrentSelection. A forma que o usuário clicou com o botão direito sempre é incluída nessa lista de formas e conectores. Se o usuário clicar em uma parte em branco do diagrama, o Diagrama será o único membro da lista.

  • this.IsDiagramSelected() - true se o usuário clicou em uma parte em branco do diagrama.

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection() - o usuário não selecionou múltiplas formas

  • this.SingleSelection - a forma ou o diagrama que o usuário clicou com o botão direito

  • shape.ModelElement as MyLanguageElement - o elemento de modelo representado por uma forma.

Para obter mais informações sobre como navegar entre elementos e sobre como criar objetos e links, consulte Navegando e atualizando um modelo no código do programa.

Consulte também

Tarefas

Como adicionar um comando ao menu de atalho

Instruções passo a passo: obtendo informações por um vínculo selecionado [redirecionado]

Referência

MenuCommand

Conceitos

Como a VSPackages adicionar elementos de Interface do usuário ao IDE

Referência de esquema XML VSCT

Outros recursos

Escrevendo código para personalizar uma linguagem específica do domínio

Tabela Visual Studio de comando (.Arquivos de VSCT)

VMSDK – Exemplo de Diagramas de Circuito. Personalização Extensiva de DSL

Código de amostra: Diagramas de Circuito