Personalizar las herramientas y el cuadro de herramientas
Debe definir elementos de cuadro de herramientas para los elementos que desea permitir a los usuarios agregar sus modelos.Hay dos tipos de herramientas: herramientas de elementos y herramientas de conexión.En el diseñador generado, un usuario puede seleccionar una herramienta de elementos para arrastrar formas en el diagrama, y puede seleccionar una herramienta de conexión a los vínculos de dibujo entre las formas.Herramientas de elementos permiten normalmente a los usuarios agregar instancias de clases de dominio a los modelos, y las herramientas de conexión los permiten agregar instancias de las relaciones de dominio.
En este tema:
Tabuladores de modificar el cuadro de herramientas
Herramientas de elemento
Crear grupos de elementos de una herramienta
Herramientas de conexión
Cambiar el orden de los elementos de cuadro de herramientas
cómo el cuadro de herramientas es definido
En el Explorador ADSL, expanda el nodo del editor y los nodos por debajo.Verá normalmente una jerarquía similar a:
Editor
Toobox Tabs
MyDsl //a tab
Tools
ExampleElement // an element tool
ExampleRelationship // a connection tool
En esta parte del Explorador ADSL, puede:
Crear nuevas pestañas.Pestañas definen los encabezados de la sección del cuadro de herramientas.
Crear nuevas herramientas.
Herramientas de copia y pegar.
Herramientas de movimiento hacia arriba o hacia abajo en la lista.
Fichas y herramientas delete.
Importante |
---|
Para agregar o pegar elementos en un Explorador ADSL, haga clic con el botón secundario en el principal del nuevo nodo.Por ejemplo, para agregar una herramienta, haga clic con el botón secundario en la pestaña, y no el nodo de Herramientas .Para agregar una pestaña, haga clic con el botón secundario en el nodo de Editor . |
La propiedad de Icono de cuadro de herramientas de cada herramienta hace referencia a un archivo de mapa de bits 16x16.Estos archivos se mantienen normalmente la carpeta de Dsl\Resources .
La propiedad de class de una herramienta de elemento hace referencia a una clase concreta del dominio.De forma predeterminada, la herramienta crea instancias de esta clase.Sin embargo, puede escribir código para que la herramienta crear grupos de elementos, o elementos de tipos diferentes.
La propiedad de Generador de conexión de una herramienta de conexión hace referencia a un generador de conexión, que define los tipos de elementos puede conectar la herramienta, y qué relaciones crea entre ellos.Los generadores de la conexión se definen como nodos del Explorador ADSL.Los generadores de la conexión se crean automáticamente al definir relaciones de dominio, pero puede escribir código para personalizarlas.
Para agregar una herramienta al cuadro de herramientas
Se suele crear una herramienta de elementos después de haber creado una clase de la forma y la ha asignado a una clase de dominio.
Se suele crear una herramienta de conector después de haber creado una clase de conector y la ha asignado a una relación de referencia.
En el Explorador ADSL, expanda el nodo de Editor y el nodo de Fichas del cuadro de herramientas .
Haga clic con el botón secundario en un nodo de la ficha del cuadro de herramientas, haga clic Agregue la nueva herramienta de elementos o Agregue la nueva herramienta de conexión.
Establezca la propiedad de Icono de cuadro de herramientas para hacer referencia a un mapa de bits 16x16.
Si desea definir un nuevo icono, cree un archivo de mapa de bits en el explorador de soluciones en la carpeta de Dsl\Resources .El archivo debe tener los siguientes valores de propiedad: Build Action = Contenido; Copiar en el directorio de resultados = no copie.
Para una herramienta de elementos: Establezca la propiedad de class de la herramienta para hacer referencia a una clase concreta de dominio asignado a una forma.
Para una herramienta de conector: Establezca la propiedad de Generador de conexión de la herramienta en uno de los elementos que se proporcionan en la lista desplegable.Los generadores de la conexión se crean automáticamente cuando se asigna un conector a relación de dominio.Si ha creado recientemente un conector, selecciona normalmente el generador asociado de la conexión.
Para probar un DSL, presione F5 o CTRL+F5, y en la instancia experimental de Visual Studio, abra un archivo de modelo de ejemplo.la nueva herramienta debe aparecer en el cuadro de herramientas.Arrástrelo hasta el diagrama para comprobar que crea un nuevo elemento.
si no aparece la herramienta, detenga Visual Studioexperimental.En el menú de Windows Iniciar , ejecute restablezca la instancia de Microsoft Visual Studio 2010 Experimental.En el menú de Visual StudioGenerar , haga clic en Volver a generar solución.A continuación pruebe ADSL de nuevo.
Personalizar las herramientas del elemento
De forma predeterminada, la herramienta creará una única instancia de la clase especificada, pero puede variar esto de dos maneras:
Definir las directivas de la combinación de elementos en otras clases, habilitandolas para aceptar nuevas instancias de esta clase, y habilitandolas para establecer relaciones adicionales cuando se crea el nuevo elemento.Por ejemplo, podría permitir que el usuario quite un comentario sobre otro elemento, y por tanto vínculos de referencia entre los dos.
Estas personalizaciones también afectan a lo que sucede cuando el usuario pega o arrastra y coloca un elemento.
Para obtener más información, vea Personalizar la creación y el movimiento de los elementos.
Escriba código para personalizar la herramienta para poder crear grupos de elementos.La herramienta se inicializa por métodos en ToolboxHelper.cs que se puede invalidar.Para obtener más información, vea Crear grupos de elementos de una herramienta.
Crear grupos de elementos de una herramienta
Cada herramienta de elementos contiene un prototipo de elementos que debe crear.De forma predeterminada, cada herramienta de elementos crea un único elemento, pero también es posible crear un grupo de objetos relacionados con la herramienta.Para ello, se inicializa la herramienta con ElementGroupPrototype que contiene los elementos relacionados.
El siguiente ejemplo se toma ADSL en las que haya un tipo Transistor.cada Transistor tiene tres denominados Terminals.La herramienta de elementos para Transistors almacena un prototipo que contiene cuatro elementos de modelo y tres vínculos de la relación.Cuando el usuario arrastra la herramienta al diagrama, el prototipo se crea instancias y se vincula a la raíz del modelo.
Este código invalida un método que está definido en Dsl\GeneratedCode\ToolboxHelper.cs.
Para obtener más información sobre cómo personalizar el modelo utilizando código de programa, vea Navegar y actualizar un modelo en el código del programa.
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
public partial class CircuitsToolboxHelper
{
/// <summary>
/// Toolbox initialization, called for each element tool on the toolbox.
/// This version deals with each Component subtype separately.
/// </summary>
/// <param name="store"></param>
/// <param name="domainClassId">Identifies the domain class this tool should instantiate.</param>
/// <returns>prototype of the object or group of objects to be created by tool</returns>
protected override ElementGroupPrototype CreateElementToolPrototype(Store store, Guid domainClassId)
{
if (domainClassId == Transistor.DomainClassId)
{
Transistor transistor = new Transistor(store);
transistor.Base = new ComponentTerminal(store);
transistor.Collector = new ComponentTerminal(store);
transistor.Emitter = new ComponentTerminal(store);
transistor.Base.Name = "base";
transistor.Collector.Name = "collector";
transistor.Emitter.Name = "emitter";
// Create an ElementGroup for the Toolbox.
ElementGroup elementGroup = new ElementGroup(store.DefaultPartition);
elementGroup.AddGraph(transistor, true);
// AddGraph includes the embedded parts
return elementGroup.CreatePrototype();
}
else
{
return base.CreateElementToolPrototype(store, domainClassId);
} } }
Personalizar las herramientas de conexión
Normalmente, se crea una herramienta de elementos cuando se crea una nueva clase de conectores.Alternativamente, puede sobrecargar una herramienta que permite que los tipos de los dos extremos determinan el tipo de la relación.Por ejemplo, puede definir una herramienta de conexión que podría crear relaciones de la Persona-Persona y las relaciones de Persona-Town.
Las herramientas de conexión invocan generadores de la conexión.Utilice generadores de conexión para especificar cómo los usuarios pueden enlazar elementos en el diseñador generado.Los creadores de conexión especifican los elementos que pueden vincularse y el tipo de vínculo que se crea entre ellos.
Al crear una relación de referencia entre las clases de dominio, un generador de conexión se crea automáticamente.Puede utilizar este generador de conexión cuando se asigna una herramienta de conexión.Para obtener más información sobre cómo crear herramientas de conexión, vea Personalizar las herramientas y el cuadro de herramientas.
Puede modificar el generador predeterminado de la conexión para que pueda tratar con un intervalo diferente de origen y de tipos de destino, y crea tipos diferentes de relación.
También puede escribir código personalizado para que los creadores de conexión especifican las clases de origen y de destino para la conexión, definen el tipo de conexión que se creará, y realiza otras medidas asociadas con la creación de una conexión.
La estructura de generadores de Conexión
Los creadores de conexión contienen una o más directivas se conectan vínculo, que especifican la relación del dominio y el origen y los elementos de destino.Por ejemplo, en la plantilla de solución de flujo de tarea, puede ver el CommentReferencesSubjectsBuilder en Explorador ADSL.Este generador de conexión contiene un CommentReferencesSubjectsdenominado directiva conectarse vínculo, que se asigna a la relación CommentReferencesSubjects de dominio.Esta directiva conectarse vínculo contiene de la directiva de origen un rol que apunta a la clase de dominio de Comment , y la directiva de destino un rol que apunta a la clase de dominio de FlowElement .
Mediante los creadores de Conexión para restringir roles de origen y de destino
Puede utilizar generadores de la conexión para limitar la aparición de algunas clases en el rol del origen o el rol de destino de una relación determinada de dominio.Por ejemplo, puede tener una clase base de dominio que tenga una relación de dominio a otra clase de dominio, pero puede que no desee todas las clases derivadas de la clase base para tener los mismos roles en esa relación.En la solución de flujo de la tarea, hay cuatro clases concretas del dominio (StartPoint, extremo, MergeBranch, y sincronización) que heredan directamente de la clase abstracta FlowElement de dominio, y dos clases concretas del dominio (tarea y ObjectInState) que heredan indirectamente de.También hay una relación de referencia de flujo que toma clases de dominio de FlowElement en el rol del origen y rol de destino.Sin embargo, una instancia de una clase de dominio de extremo no debe ser el origen de una instancia de una relación de flujo, ni debe una instancia de una clase de StartPoint ser el destino de una instancia de una relación de flujo.El creador de la conexión de FlowBuilder tiene un vínculo conectar el flujo denominado directiva que especifica que las clases de dominio desempeñan el rol de origen (tarea, MergeBranch, StartPoint, y sincronización) y que puede desempeñar el rol de destino (MergeBranch, extremo, y sincronización).
Generadores de conexión con las directivas se conectan vínculo de Varias
Puede agregar más de una directiva conectarse vínculo a un generador de la conexión.Esto ayuda a ocultar algunas de las complejidades del modelo de dominio de usuarios y mantener Cuadro de herramientas de obtener estorbado también.Puede agregar las directivas se conectan vínculo para varias relaciones de dominio a un único generador de la conexión.Sin embargo, debe combinar relaciones de dominio cuando realizan aproximadamente la misma función.
En la solución de flujo de la tarea, la herramienta de conexión de flujo se utiliza para dibujar las instancias de flujo y las relaciones de dominio de ObjectFlow.El creador de la conexión de FlowBuilder tiene, además de descrita anteriormente directiva conectarse vínculo dinámico, dos directivas se conectan vínculo denominadas ObjectFlow.Estas directivas especifican que una instancia de una relación de ObjectFlow se puede dibujar entre las instancias de la clase de dominio de ObjectInState, o una instancia de un ObjectInState a una instancia de una tarea, pero no entre dos instancias de una tarea, o una instancia de una tarea a una instancia de un ObjectInState.Sin embargo, una instancia de una relación de flujo se puede dibujar entre dos instancias de una tarea.Si compila y ejecuta la solución de flujo de tarea, puede ver que extrayendo un flujo de una instancia de un ObjectInState a una instancia de una tarea crea una instancia de un ObjectFlow, pero dibujando un flujo entre dos instancias de una tarea crea una instancia de un flujo.
Código personalizado para los generadores de Conexión
Hay cuatro casillas en la interfaz de usuario que definen tipos diferentes de personalización de generadores de conexión:
la casilla de Custom acepta en la directiva de origen o de destino un rol
la casilla de Personalizada conectar en la directiva de origen o de destino un rol
la casilla de Utiliza custom conectar en una directiva conectar
la propiedad de es personalizado de generador de conexión
Tiene que proporcionar algún código de programa para crear estas personalizaciones.Para detectar qué código debe proporcionar, compruebe uno de estos cuadros, haga clic en Todas las plantillas de transformación, y luego compilar la solución.Un informe de error se producirá.Haga doble clic en el informe de errores para ver un comentario que explica qué código se debe agregar.
[!NOTA]
Para agregar código personalizado, cree una definición de clase parcial en un archivo de código independiente de los archivos de código en las carpetas de GeneratedCode.Para evitar perder el trabajo, no debe modificar los archivos de código generados.Para obtener más información, vea Invalidar y ampliar clases generadas.
Crear el código personalizado de Conexión
En cada vínculo la directiva conectarse, la ficha de De las directivas de origen rol define de qué tipos puede arrastrar.De igual forma, la ficha de De las directivas de destino rol define qué tipos puede arrastrar.Para cada tipo, puede especificar aún más si permitir la conexión (para esa directiva conectarse vínculo) estableciendo la marca de Custom acepta y después proporcionando el código adicional.
También puede personalizar lo que ocurre cuando se realiza la conexión.Por ejemplo, puede personalizar solo el caso donde arrastre aparece a o desde una clase determinada, todos los casos que un vínculo conectarse directiva rige, o el generador integer de la conexión de FlowBuilder.Para cada una de estas opciones, puede establecer marcadores personalizados en el nivel adecuado.Al transformar todas las plantillas e intentar compilar la solución, los mensajes de error le guían a los comentarios que se encuentran en el código generado.Estos comentarios identifican lo que debe proporcionar.
En el ejemplo de diagrama de componentes, personalizar el creador de la conexión para la relación de dominio de Conexión para limitar las conexiones que se pueden crear entre los puertos.La ilustración siguiente se muestra que puede crear conexiones sólo los elementos de OutPort a los elementos de InPort , sólo puede anidar de componentes en sí.
Conexión Coming en un OutPort de un componente anidado
Por consiguiente, puede especificar que una conexión puede proceder de un componente anidado en un OutPort.Para especificar esa conexión, le Utiliza personalizado aceptan establecido en InPort escribirá como rol de origen y OutPort escribirá como rol de destino en la ventana de Detalles ADSL tal y como se muestra en las ilustraciones siguientes:
Directiva conectarse vínculo en el Explorador ADSL
Directiva conectarse vínculo en ventana detalles ADSL
Debe proporcionar métodos en la clase de ConnectionBuilder:
public partial class ConnectionBuilder
{
/// <summary>
/// OK if this component has children
/// </summary>
private static bool CanAcceptInPortAsSource(InPort candidate)
{
return candidate.Component.Children.Count > 0;
}
/// <summary>
/// Only if source is on parent of target.
/// </summary>
private static bool CanAcceptInPortAndInPortAsSourceAndTarget (InPort sourceInPort, InPort targetInPort)
{
return sourceInPort.Component == targetInPort.Component.Parent;
}
// And similar for OutPorts…
Para obtener más información sobre cómo personalizar el modelo utilizando código de programa, vea Navegar y actualizar un modelo en el código del programa.
Puede utilizar código similar, por ejemplo, para evitar que los usuarios realicen bucles con vínculos primario-secundario.Estas restricciones se consideran restricciones “duros” porque los usuarios no pueden infringirlas en cualquier momento.También puede crear comprobaciones de validación de “parcial” que los usuarios pueden omitir temporalmente creando las configuraciones no válidas que no pueden guardar.
Recomienda en generadores de Definir Connection
Debe definir un generador de la conexión para crear tipos diferentes de relaciones solo si son conceptualmente relacionados.En el ejemplo del flujo de la tarea, se utiliza el mismo generador para crear flujos entre las tareas y también entre las tareas y los objetos.Sin embargo, sería práctico utilizar el mismo generador para crear relaciones entre los comentarios y tareas.
Si define un generador de conexión para varios tipos de relaciones, debe asegurarse de que no puede coincidir con más de un tipo de los mismos pares de objetos de origen y de destino.Si no, los resultados se imprevisibles.
Utiliza código personalizado para aplicar restricciones “duros”, pero debe tener en cuenta si los usuarios puedan crear temporalmente conexiones no válidas.Si, puede modificar las restricciones para no validar conexiones hasta que los usuarios intentan guardar los cambios.
Vea también
Conceptos
Personalizar la creación y el movimiento de los elementos
Personalizar comportamiento de copia
Cómo: Agregar un controlador para arrastrar y colocar
Navegar y actualizar un modelo en el código del programa