Compartir a través de


Modificar un comando de menú estándar en un lenguaje específico de dominio

Puede modificar el comportamiento de algunos de los comandos estándar que se definen automáticamente en su DSL. Por ejemplo, podría modificar Cortar para que excluya información confidencial. Para ello, se invalidan los métodos en una clase de conjunto de comandos. Estas clases se definen en el archivo CommandSet.cs, en el proyecto DslPackage, y derivan de CommandSet.

Nota

Si quiere crear sus propios comandos de menú, consulte Procedimiento: Adición de un comando al menú contextual.

¿Qué comandos puede modificar?

Para averiguar qué comandos puede modificar

  1. En el proyecto DslPackage, abra GeneratedCode\CommandSet.cs. Este archivo de C# se encuentra en el Explorador de soluciones, como subsidiario de CommandSet.tt.

  2. En este archivo, busque las clases cuyo nombre terminan por "CommandSet", por ejemplo, Language1CommandSet y Language1ClipboardCommandSet.

  3. En cada clase de conjunto de comandos, escriba "override" seguido de un espacio. IntelliSense mostrará una lista de los métodos que puede invalidar. Cada comando tiene un par de métodos cuyos nombres comienzan por "ProcessOnStatus" y "ProcessOnMenu".

  4. Anote qué clases de conjunto de comandos contiene el comando que quiere modificar.

  5. Cierre el archivo sin guardar las ediciones.

    Nota

    Normalmente no debe editar los archivos que se han generado. Las ediciones se perderán la próxima vez que se generen los archivos.

Extienda la clase de conjunto de comandos apropiada.

Cree un nuevo archivo que contiene una declaración parcial de la clase de conjunto de comandos.

Para extender la clase de conjunto de comandos

  1. En el Explorador de soluciones, en el proyecto DslPackage, abra la carpeta GeneratedCode, busque en CommandSet.tt y abra su archivo generado CommandSet.cs. Anote el espacio de nombres y el nombre de la primera clase que se define en él. Por ejemplo, puede que vea:

    namespace Company.Language1

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

  2. En DslPackage, cree una carpeta llamada Custom Code. En esta carpeta, cree un archivo de clase llamado CommandSet.cs.

  3. En el nuevo archivo, escriba una declaración parcial que tenga el mismo espacio de nombres y nombre que la clase parcial generada. Por ejemplo:

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

    Nota

    Si usó la plantilla de archivo de clase para crear el nuevo archivo, debe corregir tanto el espacio de nombres como el nombre de la clase.

Invalidar los métodos de comando

La mayoría de los comandos tienen dos métodos asociados: el método con un nombre como ProcessOnStatus... determina si el comando debe estar visible y habilitado. Se llama siempre que el usuario hace clic con el botón secundario en el diagrama, debe ejecutarse rápidamente y no realiza cambios. ProcessOnMenu... se llama cuando el usuario hace clic en el comando, y debe realizar la función del comando. Quizás quiera invalidar uno o los dos métodos.

Para cambiar cuándo aparece el comando en un menú

Invalide el método ProcessOnStatus... Este método debe establecer las propiedades Visible y Enabled de su parámetro MenuCommand. Normalmente, el comando busca en this.CurrentSelection para determinar si se aplica a los elementos seleccionados, y también podría buscar en sus propiedades para determinar si se puede aplicar en el estado actual de las mismas.

Como regla general, la propiedad Visible se debe determinar en función de qué elementos están seleccionados. La propiedad Enabled, que determina si el comando aparece en negro o en gris en el comando, dependerá del estado actual de la selección.

En el ejemplo siguiente se deshabilita el elemento de menú Delete cuando el usuario selecciona más de una forma.

Nota

Este método no afecta a si el comando está disponible presionando una tecla. Por ejemplo, deshabilitar el elemento de menú Delete no impide que el comando se invoque desde la tecla Suprimir.

/// <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;
  }
}

El procedimiento recomendado es llamar primero al método base para que trate con todos los casos y opciones de configuración que no le conciernen.

El método ProcessOnStatus no debe crear, eliminar ni actualizar elementos en el almacén.

Para cambiar el comportamiento del comando

Invalide el método ProcessOnMenu... En el ejemplo siguiente se impide que el usuario elimine más de un elemento al mismo tiempo, aunque presione la tecla Suprimir.

/// <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();
  }
}

Si el código realiza cambios en el almacén, como crear, eliminar o actualizar elementos o vínculos, debe hacerlo dentro de una transacción. Para más información, consulte Procedimiento: Creación y actualización de elementos de modelo.

Escritura del código de los métodos

Los siguientes fragmentos suelen resultar útiles dentro de estos métodos:

  • this.CurrentSelection. La forma en la que el usuario hizo clic con el botón secundario se incluye en esta lista de formas y conectores. Si el usuario hace clic en una parte en blanco del diagrama, el diagrama es el único miembro de la lista.

  • this.IsDiagramSelected() - true si el usuario hizo clic en una parte en blanco del diagrama.

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection(): el usuario no seleccionó varias formas.

  • this.SingleSelection: forma o diagrama en los que el usuario hizo clic con el botón derecho.

  • shape.ModelElement as MyLanguageElement: elemento de modelo que representa una forma.

Para más información sobre cómo desplazarse de un elemento a otro y cómo crear objetos y vínculos, consulte Desplazamiento por un modelo en el código de programa y actualización.