Personalizar la creación y el movimiento de los elementos
Puede permitir que un elemento sea arrastrado a otro, el cuadro de herramientas o en una pegar o una operación de movimiento.Puede tener los elementos movidos vinculados a los elementos de destino, con las relaciones que especifique.
Una directiva de la combinación de elementos (EMD) especifica lo que sucede cuando un elemento del modelo se combina en otro elemento del modelo.Esto ocurre cuando:
Arrastres de usuario del cuadro de herramientas al diagrama o una forma.
El usuario crea un elemento mediante un menú del explorador o una forma de compartimiento.
El usuario mueve un elemento de un calle a otro.
el usuario pega un elemento.
El código de programa llama a la directiva de la combinación de elementos.
Aunque las operaciones de creación pueden tener ser diferentes de las operaciones de copia, funcionan realmente de la misma manera.Cuando se agrega un elemento, por ejemplo de cuadro de herramientas, un prototipo de se replica.El prototipo se combina en el modelo de la misma manera que los elementos que se han copiado de otra parte del modelo.
Responsabilidad de un EMD es decidir cómo un objeto o un grupo de objetos se debe combinar en una ubicación determinada en el modelo.En particular, decide qué relaciones se deben crear instancias para vincular el grupo combinado en el modelo.También puede personalizarlo para establecer propiedades y crear objetos adicionales.
El rol de una directiva de la combinación de elementos
Un EMD se genera automáticamente al definir una relación de incrustación.Este valor predeterminado EMD crea una instancia de la relación cuando los usuarios agregan nuevas instancias secundarias al elemento primario.Puede modificar este EMDs predeterminado, por ejemplo agregando código personalizado.
También puede agregar dispone EMDs en la definición de DSL, para permitir a los usuarios arrastrar o para pegar diferentes combinaciones de clases combinadas y que reciben.
Definición de una directiva de la combinación de elementos
Puede agregar las directivas de la combinación de elementos a las clases de dominio, las relaciones de dominio, las formas, los conectores, y los diagramas.Puede agregarlos o buscar en el Explorador ADSL bajo la clase de dominio que recibe.La clase receptora es la clase de dominio del elemento que ya está en el modelo, y sobre cuál será combinado el nuevo copiado o elemento.
Clase de indización es la clase de dominio de elementos que se pueden combinar en los miembros de la clase receptora.Las instancias de las subclases de la clase de indización también se combinarán por este EMD, a menos que se Se aplica a las subclases establecido en False.
Hay dos tipos de directiva de combinación:
Una directiva de la combinación especifica las relaciones con las que el nuevo elemento deberá vincular en el árbol.
Una directiva adelantada de combinación redirige el nuevo elemento a otro elemento que recibe, normalmente un elemento primario.
Puede agregar código personalizado a las directivas de combinación:
Establezca Utiliza personalizado aceptan para agregar el propio código para determinar si una instancia determinada del elemento de indización se debe combinar en el elemento de destino.Cuando arrastres de usuario del cuadro de herramientas, el puntero “invalid” muestran si el código deniega la combinación.
Por ejemplo, podría permitir la combinación únicamente cuando el elemento que recibe está en un estado determinado.
Establezca utiliza combinación personalizada para agregar proporcionan propio código para definir los cambios que se realizan en el modelo cuando se realiza la combinación.
Por ejemplo, puede establecer propiedades en el elemento combinado con datos de la nueva ubicación en el modelo.
[!NOTA]
Si escribe código personalizado de la combinación, afecta sólo a las combinaciones que se realizan mediante este EMD.Si hay otro EMDs que combinar el mismo tipo de objeto, o si hay otro código personalizado que crea estos objetos sin utilizar el EMD, entonces no se ve afectado por el código personalizado de la combinación.
Si desea asegurarse de que un elemento nuevo o una nueva relación se procese siempre al código personalizado, considere definir AddRule en la relación de incrustación y DeleteRule en la clase de dominio del elemento.Para obtener más información, vea Las reglas propagan los cambios dentro del modelo.
ejemplo: Definir un EMD sin código personalizado
El ejemplo siguiente permite a los usuarios crear un elemento y un conector al mismo tiempo arrastrando el cuadro de herramientas hasta una forma existente.El ejemplo agrega un EMD a la definición del ADSL.Antes de esta modificación, los usuarios pueden arrastrar herramientas al diagrama, pero no en formas existentes.
Los usuarios también pueden pegar elementos en otros elementos.
Para permitir a los usuarios crear un elemento y un conector al mismo tiempo
Cree nuevo ADSL mediante la plantilla de solución de lenguaje mínimo .
Cuando se ejecuta este DSL, permite crear formas y conectores entre las formas.No puede arrastrar una nueva forma de ExampleElement de cuadro de herramientas a una forma existente.
Para permitir a los usuarios combinar elementos en formas de ExampleElement , cree un nuevo EMD en la clase de dominio de ExampleElement :
En Explorador ADSL, expanda Clases de dominio.Haga clic con el botón secundario en ExampleElement y haga clic en Agregue la nueva directiva de la combinación de elementos.
Asegúrese de que la ventana de Detalles ADSL está abierto, para que pueda ver los detalles del nuevo EMD.(Menú: Ver, Otras ventanas, Detalles ADSL.)
Establezca Clase de indización en la ventana de detalles ADSL, para definir los tipos de elementos se puede combinar sobre los objetos de ExampleElement .
Para este ejemplo, ExampleElementsseleccione, para que pueda arrastrar nuevos elementos a elementos existentes.
Observe que la clase de indización se convierte en el nombre de EMD en el Explorador de ADSL.
En combinación de proceso creando vínculos, agregue dos rutas de acceso:
Una ruta enlaza el nuevo elemento al modelo primario.La expresión de ruta de acceso que necesita escribir navega del elemento existente, arriba con la relación de incrustación el modelo primario.Finalmente, especifica el rol en el nuevo vínculo al que el nuevo elemento se asignado.La ruta de acceso es como sigue:
ExampleModelHasElements.ExampleModel/!ExampleModel/.Elements
La otra ruta enlaza el nuevo elemento al elemento existente.La expresión de ruta especifica la relación de referencia y roles a los que el nuevo elemento se asignado.Esta ruta de acceso es como sigue:
ExampleElementReferencesTargets.Sources
Puede utilizar la herramienta de navegación ruta para crear cada ruta de acceso:
En combinación de proceso creando vínculos en las rutas, haga clic <agregue la ruta> .
Haga clic en la flecha de lista desplegable situada a la derecha del elemento de lista.una vista de árbol aparece.
Expanda los nodos en el árbol para formar la ruta que desee especificar.
Pruebe ADSL:
Presione F5 para recompilar y ejecutar la solución.
El recompilar durará que habitual porque el código generado se actualizará de plantillas de texto para ajustarse nueva a ADSL la definición.
Cuando la instancia experimental de Visual Studio ha empezado, abra un archivo modelo ADSL.Cree algunos elementos de ejemplo.
Arrastre desde la herramienta de Elemento de ejemplo sobre una forma existente.
Una nueva forma aparece, y se vincula a forma existente con un conector.
copie una forma existente.Seleccione otra forma y pegar.
una copia de la primera forma se crea.Tiene un nombre y se vincula a la segunda forma con un conector.
Tenga en cuenta los siguientes puntos de este procedimiento:
Crear directivas de la combinación de elementos, puede permitir que cualquier tipo de elemento acepta cualquier otro.El EMD se crea en la clase de dominio que recibe, y la clase de dominio aceptado se especifica en el campo de Clase de índice .
Definir las rutas, puede especificar qué vincula se debe usar para conectar con el nuevo elemento al modelo existente.
Los vínculos que especifique deben incluir una relación que inserta.
El EMD afecta a la creación del cuadro de herramientas y también pega operaciones.
Si escribe el código personalizado que crea nuevos elementos, puede invocar explícitamente el EMD utilizando el método de ElementOperations.Merge .Esto asegura que el código enlace nuevos elementos en el modelo igual que otras operaciones.Para obtener más información, vea Personalizar comportamiento de copia.
ejemplo: Custom de suma acepta código un EMD
Agregar código personalizado a un EMD, puede definir un comportamiento más complejo de combinación.Este sencillo ejemplo impide que el usuario agregue más que un número fijo de elementos al diagrama.El ejemplo se modifica el valor predeterminado EMD que acompaña a una relación de incrustación.
Para escribir personalizado acepta el código para restringir qué puede agregar el usuario
Cree un DSL mediante la plantilla de solución de lenguaje mínimo .Abra el diagrama de la definición del ADSL.
En el Explorador ADSL, expanda Clases de dominio, ExampleModel, Directivas de la combinación de elementos.Seleccione la directiva de combinación del elemento que se denomina ExampleElement.
Controles de este EMD cómo el usuario puede crear nuevos objetos de ExampleElement en el modelo, por ejemplo arrastrando el cuadro de herramientas.
En la ventana de Detalles ADSL , seleccione Utiliza personalizado aceptan.
Recompilar la solución.Esto durará que habitual porque el código generado será actualizado del modelo.
Un error de compilación se notificará, similar a: “Company.ElementMergeSample.ExampleElement no contiene una definición de CanMergeExampleElement…”
Debe implementar el método CanMergeExampleElement.
cree un nuevo archivo de código en el proyecto de DSL .Reemplace el contenido por el código siguiente y cambie el espacio de nombres al espacio de nombres del proyecto.
using Microsoft.VisualStudio.Modeling; namespace Company.ElementMergeSample // EDIT. { partial class ExampleModel { /// <summary> /// Called whenever an ExampleElement is to be merged into this ExampleModel. /// This happens when the user pastes an ExampleElement /// or drags from the toolbox. /// Determines whether the merge is allowed. /// </summary> /// <param name="rootElement">The root element in the merging EGP.</param> /// <param name="elementGroupPrototype">The EGP that the user wants to merge.</param> /// <returns>True if the merge is allowed</returns> private bool CanMergeExampleElement(ProtoElementBase rootElement, ElementGroupPrototype elementGroupPrototype) { // Allow no more than 4 elements to be added: return this.Elements.Count < 4; } } }
Este sencillo ejemplo limita el número de elementos que se pueden combinar en el modelo del elemento primario.Para condiciones más interesantes, el método puede inspeccionar propiedades y vínculos cualquiera del objeto que recibe.También puede examinar las propiedades de los elementos de combinación, que se presentan en ElementGroupPrototype.Para obtener más información sobre ElementGroupPrototypes, vea Personalizar comportamiento de copia.Para obtener más información sobre cómo escribir código que lee un modelo, vea Navegar y actualizar un modelo en el código del programa.
Pruebe ADSL:
Presione F5 para recompilar la solución.Cuando se abre la instancia experimental de Visual Studio , abra una instancia de ADSL.
Crear nuevos elementos de varias maneras:
Arrastre desde la herramienta de Elemento de ejemplo al diagrama.
En Explorador de modelos de ejemplo, haga clic con el botón secundario en el nodo raíz y haga clic en Agregar nuevo elemento de ejemplo.
Copie y pegue un elemento del diagrama.
Comprobará que no puede utilizar cualquiera de estas maneras de agregar más de cuatro elementos al modelo.Esto es porque todos usan la directiva de la combinación de elementos.
ejemplo: Código personalizado de combinación a un EMD
En código de combinación personalizado, puede definir qué ocurre cuando el usuario arrastra una herramienta o pegarlo sobre un elemento.hay dos maneras de definir una combinación personalizada:
Establezca utiliza combinación personalizada y proporcione el código necesario.el código reemplaza el código generado de la combinación.Utilice esta opción si desea volver a definir completamente lo que hace la combinación.
invalide el método de MergeRelate , y opcionalmente el método de MergeDisconnect .Para ello, debe establecer la propiedad de genera derivado doble de la clase de dominio.El código puede llamar al código generado de la combinación en la clase base.Utilice esta opción si desea realizar operaciones adicionales una vez realizada la combinación.
Estos enfoques afectan a las combinaciones que se realizan mediante este EMD.Si desea que afecte a todas las maneras en las que el elemento combinado puedan crear, una alternativa es definir AddRule en la relación de incrustación y DeleteRule en la clase combinada de dominio.Para obtener más información, vea Las reglas propagan los cambios dentro del modelo.
Para reemplazar MergeRelate
En la definición de DSL, asegúrese de que tiene definido el EMD al que desea agregar el código.Si lo desea, puede agregar rutas y definir personalizado acepta el código como se describe en las secciones anteriores.
En el diagrama de DslDefinition, seleccione la clase que recibía de combinación.Normalmente es la clase en el extremo de origen de una relación de incrustación.
Por ejemplo, en un DSL generado de la solución de lenguaje mínimos, seleccione ExampleModel.
en la ventana de Propiedades , establezca genera derivado doble a TRUE.
Recompilar la solución.
inspeccione el contenido de Dsl\Generated Files\DomainClasses.cs.Buscar los métodos denominados MergeRelate y examinar su contenido.Esto le ayudará a escribir dispone de versiones.
En un nuevo archivo de código, escriba una clase parcial para la clase receptora, y reemplace el método de MergeRelate .Recuerde llamar al método base.Por ejemplo:
partial class ExampleModel { /// <summary> /// Called when the user drags or pastes an ExampleElement onto the diagram. /// Sets the time of day as the name. /// </summary> /// <param name="sourceElement">Element to be added</param> /// <param name="elementGroup">Elements to be merged</param> protected override void MergeRelate(ModelElement sourceElement, ElementGroup elementGroup) { // Connect the element according to the EMD: base.MergeRelate(sourceElement, elementGroup); // Custom actions: ExampleElement mergingElement = sourceElement as ExampleElement; if (mergingElement != null) { mergingElement.Name = DateTime.Now.ToLongTimeString(); } } }
Para escribir código personalizado de combinación
en Dsl\Generated Code\DomainClasses.cs, inspeccione los métodos denominados MergeRelate.estos métodos establecen relaciones entre un nuevo elemento y el modelo existente.
también, inspeccione los métodos denominados MergeDisconnect.Estos métodos desatan un elemento de modelo cuando debe eliminarse.
En Explorador ADSL, seleccione o cree la directiva de combinación del elemento que desea personalizar.en la ventana de Detalles ADSL , establezca utiliza combinación personalizada.
Cuando se establece esta opción, combinación de proceso y las opciones de Combinación directa omiten.El código se utiliza en su lugar.
Recompilar la solución.Durará que habitual porque los archivos de código generados se actualizarán del modelo.
Los mensajes de error.Haga doble clic en los mensajes de error para ver las instrucciones del código generado.Estas instrucciones pide que proporcione dos métodos, MergeRelateTheDomainClass y MergeDisconnectTheDomainClass
Escriba los métodos en una definición de clase parcial en un archivo de código independiente.Los ejemplos que se ha inspeccionado anterior deben indicar lo que necesita.
El código personalizado de combinación no afectará al código que crea objetos y relaciones directamente, y no afectará al otro EMDs.Para asegurarse de que los cambios adicionales se implementarán independientemente de cómo se crea el elemento, considere escribir AddRule y DeleteRule en su lugar.Para obtener más información, vea Las reglas propagan los cambios dentro del modelo.
Redirigir una operación de combinación
Una directiva adelantada de combinación redirige el destino de una operación de combinación.Normalmente, el nuevo destino es el elemento primario de incrustación de destino inicial.
Por ejemplo, en un DSL creada con la plantilla componente de diagrama, los puertos se insertan en componentes.Los puertos se muestran como pequeñas formas al borde de una forma de componente.El usuario crea puertos arrastrando el puerto sobre una forma de componente.Pero a veces, el usuario arrastra por la herramienta de puerto sobre un puerto existente, en lugar del componente, y se produce un error en la operación.esto es un error fácil cuando hay varios puertos existentes.Para ayudar a evitar esta molestia, puede permitir que los puertos se arrastran sobre un puerto existente, pero tiene la acción redirigido el componente primario.la operación funciona como si el elemento de destino fuera el componente.
Puede crear una directiva adelantada de combinación en la solución de componente.Si compila y ejecuta la solución original, debe comprobar que los usuarios pueden arrastrar cualquier número de puerto de conexión o elementos de puerto de salida de Cuadro de herramientas a un elemento de Componente .sin embargo, no pueden arrastrar un puerto a un puerto existente.El puntero no disponibles los indicándole que este movimiento no está habilitado.Sin embargo, puede crear una directiva adelantada de combinación para reenviar un puerto que se quite involuntariamente en puerto de conexión existente al elemento de Componente .
Para crear una directiva adelantada de combinación
Cree una solución de Domain-Specific Language Tools mediante la plantilla de componente.
Muestra Explorador ADSL por DslDefinition.dsl de.
En Explorador ADSL, expanda Clases de dominio.
La clase de dominio del resumen de ComponentPort es la clase base de InPort y de OutPort.Haga clic con el botón secundario en ComponentPort y haga clic en Agregue la nueva directiva de la combinación de elementos.
Un nuevo nodo de Directiva de la combinación de elementos aparece bajo el nodo de Directivas de la combinación de elementos .
Seleccione el nodo de Directiva de la combinación de elementos y abra la ventana de Detalles ADSL .
En la lista de clases de indización, seleccione ComponentPort.
Combinación directa de otra clase de dominioseleccione.
En la lista de selección de ruta, expanda ComponentPort, expanda ComponentHasPortsy, a continuación Componente.
La nueva ruta de acceso debe ser similar esto:
El ComponentHasPorts.Component/! Componente
Guarde la solución y, a continuación transformar plantillas haciendo clic en el botón a la derecha en la barra de herramientas de Explorador de soluciones .
Compile y ejecute la solución.una nueva instancia de Visual Studio aparece.
En Explorador de soluciones, abra Sample.mydsl.el diagrama y cuadro de herramientas de ComponentLanguage aparecen.
arrastre puerto de conexión de Cuadro de herramientas a otro puerto de conexión. A continuación, arrastre OutputPort a InputPort y después a otro OutputPort.
No debería ver el puntero no disponible, y debe poder quitar nuevo puerto de conexión en el existente.Seleccione nuevo puerto de conexión y arrástrelo a otro punto de Componente.
Vea también
Conceptos
Navegar y actualizar un modelo en el código del programa
Personalizar las herramientas y el cuadro de herramientas