Cómo: Modificar comandos de menú estándar en lenguajes específicos 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.
En resumen, para modificar un comando:
Averigüe qué comandos puede modificar.
Cree una declaración parcial de la clase de conjunto de comandos apropiada.
Invalide los métodos ProcessOnStatus y ProcessOnMenu del comando.
En este tema se explica el procedimiento.
Nota
Si quiere crear sus propios comandos de menú, vea Cómo: Agregar un comando a un menú contextual.
¿Qué comandos puede modificar?
Para averiguar qué comandos puede modificar
En el proyecto DslPackage, abra GeneratedCode\CommandSet.cs. Este archivo de C# se encuentra en el Explorador de soluciones, como subsidiario de CommandSet.tt.
En este archivo, busque las clases cuyo nombre terminan por "CommandSet", por ejemplo, Language1CommandSet y Language1ClipboardCommandSet.
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".
Anote qué clases de conjunto de comandos contiene el comando que quiere modificar.
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
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 : ...
En DslPackage, cree una carpeta llamada Custom Code. En esta carpeta, cree un nuevo archivo de clase llamado CommandSet.cs.
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 ser visible y estar 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 obtener más información, vea Cómo: Modificar comandos de menú estándar en lenguajes específicos de dominio.
Escribir el 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 secundario.
shape.ModelElement as MyLanguageElement: elemento de modelo representado por una forma.
Para obtener más información sobre cómo navegar de un elemento a otro y cómo crear objetos y vínculos, vea Navegar y actualizar un modelo en el código del programa.
Vea también
Tareas
Cómo: Agregar un comando a un menú contextual
[redirigir] Tutorial: Obtener información de un vínculo seleccionado
Referencia
Conceptos
Cómo VSPackages agrega elementos de la interfaz de usuario al IDE
Referencia del esquema XML de VSCT
Otros recursos
Escribir código para personalizar lenguajes específicos de dominio
Tabla de comandos de Visual Studio (. archivos de Vsct)
VMSDK: muestra de diagramas de circuitos. Personalización extensiva de DSL