Como: modificar um comando de Menu padrão em um idioma específico do domínio
Você pode modificar o comportamento de alguns dos comandos padrão que são definidos automaticamente no seu DSL.Por exemplo, você poderia modificar Recortar para que ele exclui informações confidenciais.Para fazer isso, você pode substituir métodos em uma classe de conjunto de comando.Essas classes são definidas no arquivo CommandSet.cs, no projeto DslPackage e são derivados de CommandSet.
Em resumo, para modificar um comando:
Descubra quais comandos que você pode modificar.
Crie uma declaração parcial da classe apropriada do comando set.
Substituir os métodos ProcessOnStatus e ProcessOnMenu para o comando.
Este tópico explica esse procedimento.
Observação |
---|
Se você desejar criar seus próprios comandos de menu, consulte Como: adicionar um comando ao Menu de atalho. |
Os comandos que você pode modificar?
Para descobrir quais comandos que você podem modificar
No DslPackage o projeto, abrir GeneratedCode\CommandSet.cs.Este arquivo C# pode ser encontrado no Solution Explorer, como uma subsidiária da CommandSet.tt.
Localizar classes neste arquivo cujos nomes terminam com "CommandSet", por exemplo Language1CommandSet e Language1ClipboardCommandSet.
Em cada classe de conjunto de comando, digite "override" seguido por um espaço.IntelliSense mostrará uma lista dos métodos que podem ser substituídos.Cada comando tem um par de métodos cujos nomes começam "ProcessOnStatus"e"ProcessOnMenu".
Observe que o comando definir classes contém o comando que você deseja modificar.
Feche o arquivo sem salvar as edições.
Observação Normalmente, você não deve editar os arquivos que foram gerados.Todas as edições serão perdidas na próxima vez que os arquivos são gerados.
Estender a classe de conjunto de comando apropriado
Crie um novo arquivo que contém uma declaração parcial da classe do conjunto de comando.
Estender a classe do comando Set
No Solution Explorer, no projeto DslPackage, abra a pasta GeneratedCode e procure em CommandSet.tt e abrir seu arquivo gerado CommandSet.cs.Observe o espaço para nome e o nome da primeira classe que é definido ali.Por exemplo, você pode ver:
namespace Company.Language1
{ ... internal partial class Language1CommandSet : ...
Na DslPackage, crie uma pasta chamada código personalizado.Nesta pasta, crie um novo arquivo de classe chamado CommandSet.cs.
No novo arquivo, escreva uma declaração parcial que tenha o mesmo namespace e nome da 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 você usou o modelo de arquivo de classe para criar o novo arquivo, você deve corrigir o espaço para nome e o nome da classe.
Substituir os métodos de comando
A maioria dos comandos têm dois métodos de associado: O método com um nome, como ProcessOnStatus...Determina se o comando deve ser visível e ativado.Ele é chamado sempre que o usuário clica o diagrama e deve executar rapidamente e não fazer alterações.ProcessOnMenu...é chamado quando o usuário clica no comando e execute a função do comando.Talvez você queira substituir um ou ambos os métodos.
Para alterar quando o comando é exibido em um menu
Substitua o ProcessOnStatus...Método.Este método deve definir a visível e ativado propriedades de seu parâmetro MenuCommand.Normalmente o comando analisa isso.CurrentSelection para determinar se o comando se aplica aos elementos selecionados e também pode examinar suas propriedades para determinar se o comando pode ser aplicado em seu estado atual.
Como um guia geral, a propriedade Visible deve ser determinada por quais elementos são selecionadas.A propriedade Enabled, que determina se o comando aparece preto ou cinza no menu, deve depender do estado atual da seleção.
O exemplo a seguir desativa o item de menu Delete quando o usuário tiver selecionado mais de uma forma.
Observação |
---|
Este método não afeta se o comando está disponível por meio de um pressionamento de tecla.Por exemplo, desativar o item de menu Delete não impede que o comando que está sendo chamado por meio a 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;
}
}
É recomendável para chamar o método base pela primeira vez, para lidar com todos os casos e configurações com os quais você não estiver preocupado.
O método ProcessOnStatus não deve criar, excluir ou atualizar elementos no repositório.
Para alterar o comportamento do comando
Substitua o ProcessOnMenu...Método.O exemplo a seguir impede que o usuário excluir mais de um elemento por vez, até 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 seu código fizer alterações no armazenamento, como, por exemplo, criar, excluir ou atualizar elementos ou links, você deve fazê-lo dentro de uma transação.Para obter mais informações, consulte Como: modificar um comando de Menu padrão em um idioma específico do domínio.
Escrever o código dos métodos
Os fragmentos a seguir são freqüentemente úteis dentro destes métodos:
this.CurrentSelection.A forma que o usuário right-clicked sempre está incluída nesta lista de formas e conectores.Se o usuário clica em uma parte em branco do diagrama, o diagrama é o único membro da lista.
this.IsDiagramSelected() - trueSe o usuário clicou em uma parte em branco do diagrama.
this.IsCurrentDiagramEmpty()
this.IsSingleSelection()-o usuário não tiver selecionado várias formas
this.SingleSelection-a forma ou o diagrama que o usuário right-clicked
shape.ModelElement as MyLanguageElement-o elemento de modelo representado por uma forma.
Para obter mais informações sobre como navegar de um elemento para o elemento e sobre como criar objetos e vínculos, consulte Navegando e atualizando um modelo de código de programa.
Consulte também
Tarefas
Como: adicionar um comando ao Menu de atalho
[redirecionar] Passo a passo: Obtendo informações a partir de um Link selecionado
Referência
Conceitos
Como a VSPackages adicionar elementos de Interface do usuário ao IDE
Referência de esquema XML VSCT
Outros recursos
Escrever código para personalizar uma linguagem específica de domínio
Tabela Visual Studio de comando (.Arquivos de VSCT)
VMSDK – exemplo de diagramas de circuito. Personalização de DSL abrangente