Condividi tramite


Personalizzazione della creazione e dello spostamento di elementi

È possibile consentire un elemento da trascinare su un altro, dalla casella degli strumenti o in una funzione incolla o l'operazione di spostamento.È possibile disporre gli elementi spostati collegati agli elementi di destinazione, utilizzando le relazioni specificato.

Una direttiva di unione dell'elemento specifica (EMD) che si verifica quando un elemento di modello viene unito in un altro elemento del modello.ciò si verifica quando:

  • I trascina utente dalla casella degli strumenti nel diagramma o in una forma.

  • L'utente crea un elemento utilizzando un menu aggiunta di nell'esploratore o in una forma di raggruppamento.

  • L'utente sposta un elemento da uno corsia a un altro.

  • l'utente incolla un elemento.

  • Il codice del programma chiama la direttiva di unione dell'elemento.

Sebbene le operazioni di creazione potrebbero risultare diversi dalle operazioni di copia, in realtà funzionano in modo analogo.Quando si aggiunge un elemento, ad esempio dalla casella degli strumenti, un prototipo di viene replicato.Il prototipo viene unito al modello allo stesso modo di elementi che sono stati copiati da un'altra parte del modello.

La responsabilità di un EMD consiste nel decidere come un oggetto o un gruppo di oggetti deve essere inserito in una determinata posizione del modello.In particolare, stabilisce che relazioni devono essere creata un'istanza per importare il gruppo unito nel modello.È inoltre possibile personalizzarlo per impostare le proprietà e creare oggetti aggiuntivi.

Il ruolo di una direttiva di unione dell'elemento

DSL-EMD_Merge

Un EMD viene generato automaticamente quando si definisce una relazione che utilizza.Questa impostazione predefinita EMD crea un'istanza di una relazione quando gli utenti aggiungono nuove istanze figlio al padre.È possibile modificare questo EMDs predefinito, ad esempio aggiungendo il codice personalizzato.

È possibile aggiungere anche per altri EMDs nella definizione di modello DSL, per consentire agli utenti possono trascinare o per incollare le combinazioni diverse di classi unite e di ricezioni.

Definizione della direttiva di unione dell'elemento

È possibile aggiungere direttive di unione delle classi di dominio, alle relazioni di dominio, le forme, ai connettori e ai diagrammi.È possibile aggiungerli o trovare nel modello DSL Esplora Soluzioni in classi di dominio di ricezione.La classe ricevente è la classe di dominio dell'elemento su nel modello e in cui il nuovo elemento o copiato verrà unito.

DSL-EMD_Details

Indicizzazione di classe è la classe di dominio di elementi che possono essere uniti nei membri della classe ricevente.Le istanze delle sottoclassi della classe di non verranno unite da questo EMD, a meno che non si imposti Si applica alle sottoclassi su False.

Esistono due tipi di direttiva di unione:

  • In Unione di processo la direttiva specifica le relazioni che il nuovo elemento deve essere collegato nella struttura ad albero.

  • In inoltrare l'unione la direttiva reindirizza il nuovo elemento a un altro elemento di ricezione, in genere un elemento padre.

È possibile aggiungere codice personalizzato alle direttive di unione:

  • set L'oggetto personalizzato viene utilizzata accetta per aggiungere il codice per determinare se un'istanza particolare elemento dell'indicizzazione deve essere estesa nell'elemento di destinazione.Quando si trascina dalla casella degli strumenti, visualizza “non valido„ del puntatore se il codice impedisce l'unione.

    Ad esempio, è possibile consentire l'unione solo quando l'elemento di ricezione si trova in un determinato stato.

  • set Unione personalizzata di utilizzo per aggiungere fornire il proprio codice per definire le modifiche apportate al modello quando l'unione viene eseguita.

    Ad esempio, è possibile impostare le proprietà nell'elemento unito tramite i dati dalla nuova posizione nel modello.

[!NOTA]

Se si scrive il codice di unione personalizzata, influisce solo sulle unioni eseguite tramite questo EMD.Se c " è un altro EMDs che eseguono lo stesso tipo di oggetto, o se c " è altro codice personalizzato per creare questi oggetti senza utilizzare i EMD, pertanto non saranno interessati dal codice di unione personalizzata.

Se si desidera che un nuovo elemento o una nuova relazione viene elaborato sempre dal codice personalizzato, si consideri la definizione AddRule nella relazione e in per incorporare DeleteRule nella classe di dominio dell'elemento.Per ulteriori informazioni, vedere Le regole propagano le modifiche all'interno del modello.

esempio: Definizione di EMD senza codice personalizzato

Il seguente esempio consente agli utenti di creare un elemento e un connettore contemporaneamente mediante il trascinamento dalla casella degli strumenti in una forma esistente.Viene aggiunto un EMD alla definizione di modello DSL.Prima di questa modifica, gli utenti possono trascinare gli strumenti nel diagramma, ma non sull'esistenza forme.

Gli utenti possono anche incollare elementi su altri elementi.

Per consentire agli utenti di creare un elemento e un connettore contemporaneamente

  1. Creare un nuovo modello DSL tramite linguaggio minimo modello della soluzione.

    Quando si esegue questo modello DSL, consente di creare forme e i connettori tra le forme.Non è possibile trascinare un nuovo ExampleElement il form dalla casella degli strumenti in una forma esistente.

  2. Per consentire agli utenti di unire gli elementi in ExampleElement le forme, creare un nuovo EMD in ExampleElement classe di dominio:

    1. in DSL Esplora Risorseespandere, classi di dominio.Fare clic con il pulsante destro del mouse ExampleElement quindi scegliere Aggiungere la nuova direttiva di unione dell'elemento.

    2. Assicurarsi che Dettagli DSL la finestra è aperta, in modo che sia possibile visualizzare i dettagli di nuovo EMD.(Menu: visualizzazione, altre finestre, Dettagli DSL).

  3. impostare Indicizzazione di classe nel modello DSL la finestra dettagli, per definire la classe di elementi può essere unito ExampleElement oggetti.

    Per questo esempio, selezionare ExampleElements, in modo che l'utente può trascinare i nuovi elementi sugli elementi esistenti.

    Si noti che la classe non appena diventa il nome del EMD nel modello DSL Esplora Risorse.

  4. In Unione del processo di creazione dei collegamenti, aggiungere due percorsi:

    1. Un percorso collega il nuovo elemento al modello padre.L'espressione del percorso in cui si deve spostare esplora dall'elemento esistente, con la relazione che utilizza il modello padre.Infine, specifica il ruolo nel nuovo collegamento in cui il nuovo elemento verrà assegnato.Il percorso è il seguente:

      ExampleModelHasElements.ExampleModel/!ExampleModel/.Elements

    2. Un altro percorso collega il nuovo elemento all'elemento esistente.L'espressione del percorso specifica la relazione di riferimento e il ruolo a cui il nuovo elemento verrà assegnato.Questo percorso è il seguente:

      ExampleElementReferencesTargets.Sources

    È possibile utilizzare lo strumento di navigazione percorso per creare ogni percorso:

    1. In Unione del processo creando collegamenti ai percorsi, quindi <aggiungere il percorso> .

    2. Fare clic sulla freccia a discesa a destra dell'elemento di elenco.Una visualizzazione struttura ad albero viene visualizzato.

    3. Espandere i nodi nella struttura ad albero per formare il percorso che si desidera specificare.

  5. Testare il modello DSL:

    1. Premere F5 per ricompilare ed eseguire la soluzione.

      Ricompilare impiegherà più tempo di quanto il codice generato sarà aggiornato dai modelli di testo per conformità alla nuova definizione di modello DSL.

    2. quando l'istanza sperimentale di Visual Studio ha avviato, aprire un file di modello DSL.creare alcuni elementi di esempio.

    3. Trascinare dal elemento di esempio strumento in una forma esistente.

      Una nuova forma verrà visualizzato è collegata alla forma esistente con un connettore.

    4. copiare una forma esistente.Selezionare un'altra altre forme e incolla.

      Una copia della prima forma viene creata.Ha un nuovo nome e è collegata alla seconda forma con un connettore.

Tenere presente i seguenti punti da questa procedura:

  • Creando le direttive di unione dell'elemento, è possibile consentire a qualsiasi classe di elemento accetta qualsiasi altro.Il EMD viene creato nella classe di dominio di ricezione e la classe di dominio accettata viene specificata in Classe di indice campo.

  • Definizione dei percorsi, è possibile specificare l'evento che si collega deve essere utilizzato per connettere il nuovo elemento al modello esistente.

    I collegamenti specificati devono includere una relazione che utilizza.

  • Il EMD ha effetto sulla creazione della casella degli strumenti che anche le operazioni Incolla.

    Se si scrive codice personalizzato per creare nuovi elementi, è possibile richiamare in modo esplicito il EMD tramite ElementOperations.Merge metodo.Ciò garantisce che il codice incluso nuovi elementi del modello come altre operazioni.Per ulteriori informazioni, vedere Personalizzazione del comportamento di copia.

esempio: L'oggetto personalizzato di aggiunta accetta il codice a un EMD

Aggiunta di codice personalizzato a un EMD, è possibile definire il comportamento più complesso di unione.In questo semplice esempio impossibilità di aggiungere più di un numero fisso degli elementi nel diagramma.L'esempio modifica l'impostazione predefinita EMD che accompagna una relazione che utilizza.

Per scrivere l'oggetto personalizzato accettare il codice per limitare che l'utente possibile aggiungere

  1. Creare un modello DSL tramite linguaggio minimo modello della soluzione.Aprire il diagramma della definizione di modello DSL.

  2. Nel modello DSL Esplora Soluzioni, espandere classi di dominio, ExampleModel, Direttive di unione dell'elemento.Selezionare la direttiva di unione dell'elemento denominata ExampleElement.

    Controlli di questo EMD quali l'utente può creare un nuovo ExampleElement oggetti del modello, ad esempio il trascinamento dalla casella degli strumenti.

  3. in Dettagli DSL finestra, selezionare L'oggetto personalizzato viene utilizzata accetta.

  4. Ricompilare la soluzione.In questo modo diventa più tempo di quanto il codice generato sarà aggiornato dal modello.

    Un errore di compilazione verrà segnalato, simile al seguente: “Company.ElementMergeSample.ExampleElement non contiene una definizione per CanMergeExampleElement…„

    È necessario implementare il metodo CanMergeExampleElement.

  5. creare un nuovo file di codice in Dsl progetto.Sostituire il contenuto con il codice seguente e modificare lo spazio dei nomi allo spazio dei nomi di progetto.

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

    In questo semplice esempio limita il numero di elementi che possono essere uniti nel modello del padre.Per le condizioni più interessanti, il metodo può controllare qualsiasi proprietà e i collegamenti di ricezione oggetto.Inoltre possibile controllare le proprietà degli elementi di unione, ovvero nell'intervallo ElementGroupPrototype.Per ulteriori informazioni su ElementGroupPrototypes, vedere Personalizzazione del comportamento di copia.Per ulteriori informazioni su come scrivere codice che legge un modello, vedere Esplorazione e aggiornamento di un modello nel codice del programma.

  6. Testare il modello DSL:

    1. premere F5 per ricompilare la soluzione.quando l'istanza sperimentale di Visual Studio aprire, aprire un'istanza del modello DSL.

    2. Creare nuovi elementi in diversi modi:

      1. Trascinare dal elemento di esempio strumento nel diagramma.

      2. in Esempio Esplora Risorse di modello, fare clic con il pulsante destro del mouse sul nodo radice e scegliere aggiungere il nuovo elemento di esempio.

      3. Copiare e incollare un elemento del diagramma.

    3. Verificare l'impossibilità di utilizzare queste modalità aggiungere più di quattro elementi al modello.Ciò è dovuto al fatto che utilizzano la direttiva di unione dell'elemento.

esempio: Codice di unione personalizzata a un EMD

Nel codice di unione personalizzata, è possibile definire ciò che si verifica quando l'utente trascina lo strumento o incollare su un elemento.Esistono due modi per definire l'unione personalizzata:

  1. set Unione personalizzata di utilizzo e fornire il codice necessario.Il codice sostituire il codice generato di unione.Utilizzare questa opzione se si desidera completamente per ridefinire cosa l'unione fa.

  2. eseguire l'override MergeRelate metodo e facoltativamente MergeDisconnect metodo.A questo scopo, è necessario impostare genera il doppio derivato proprietà della classe di dominio.Il codice può chiamare il codice generato di unione nella classe base.Utilizzare questa opzione se si desidera eseguire operazioni aggiuntive dopo che l'unione è stata eseguita.

Questi approcci su solo le unioni eseguite tramite questo EMD.Se si desidera controllare tutte le modalità in cui l'elemento fuso può essere creato, un'alternativa consiste nel definire AddRule nella relazione e in per incorporare DeleteRule nella classe di dominio unita.Per ulteriori informazioni, vedere Le regole propagano le modifiche all'interno del modello.

Per eseguire l'override di MergeRelate

  1. Nella definizione di modello DSL, assicurarsi di aver definito il EMD in cui si desidera aggiungere il codice.Se lo si desidera, è possibile aggiungere i percorsi e definire proprietà personalizzate accettare il codice come descritto nelle sezioni precedenti.

  2. Nel diagramma di DslDefinition, selezionare la classe ricevente dell'unione.In genere è la classe all'entità finale di origine di una relazione che utilizza.

    Ad esempio, in un modello DSL generato dalla soluzione minima del linguaggio, selezionare ExampleModel.

  3. in proprietà finestra, impostare genera il doppio derivato in true.

  4. Ricompilare la soluzione.

  5. controllare il contenuto di Dsl\Generated Files\DomainClasses.cs.Ricerca dei metodi denominati MergeRelate ed esaminare il contenuto.Ciò consentirà alla scrittura delle versioni.

  6. In un nuovo file di codice, scrivere una classe parziale per la classe ricevente ed eseguire l'override MergeRelate metodo.Ricordare chiamare il metodo di base.Di seguito è riportato un esempio:

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

Per scrivere codice personalizzato di unione

  1. in Dsl\Generated Code\DomainClasses.cs, controllare i metodi denominati MergeRelate.Questi metodi creano collegamenti tra un nuovo elemento e il modello esistente.

    inoltre, controllare i metodi denominati MergeDisconnect.Questi metodi sconnettono un elemento dal modello quando è necessario eliminare.

  2. in DSL Esplora Risorseselezionare o, creare la direttiva di unione dell'elemento che si desidera personalizzare.in Dettagli DSL finestra, impostare Unione personalizzata di utilizzo.

    Quando si imposta questa opzione, Unione di processo e inoltrare l'unione le opzioni vengono ignorate.Il codice viene utilizzato invece.

  3. Ricompilare la soluzione.Impiegherà più tempo di quanto i file di codice generati verranno aggiornati dal modello.

    I messaggi di errore visualizzati.Fare doppio clic sui messaggi di errore per visualizzare le istruzioni del codice generato.Queste istruzioni gli chiedano di fornire due metodi, MergeRelateTheDomainClass e MergeDisconnectTheDomainClass

  4. Scrivere i metodi in una definizione di classe parziale in un file di codice distinto.Gli esempi avere archiviato in precedenza devono indicare alle proprie esigenze.

Il codice di unione personalizzata non influirà sul codice che vengano create direttamente gli oggetti e le relazioni e non influirà su un altro EMDs.Per verificare che le modifiche aggiuntive vengano distribuite indipendentemente da come elemento viene creato, considerare la scrittura AddRule e DeleteRule anziché.Per ulteriori informazioni, vedere Le regole propagano le modifiche all'interno del modello.

Reindirizzamento dell'operazione di unione

Una direttiva con prototipo di unione reindirizza la destinazione di un'operazione di unione.In genere, il nuovo database di destinazione è il padre l'inserimento di destinazione iniziale.

Ad esempio, in un modello DSL creato con il modello del diagramma dei componenti, le porte sono incorporate nei componenti.Le porte visualizzati come piccole forme sull'orlo della forma di un componente.L'utente crea le porte trascinando lo strumento della porta sulla forma di un componente.Talvolta, l'utente si trascina lo strumento della porta su una porta esistente, anziché del componente e l'operazione non viene completata.Si tratta di un errore facile quando sono presenti più porte esistenti.Per guidino a evitare tale da, è possibile consentire alle porte da trascinare su una porta esistente, ma avere l'azione reindirizzata al componente padre.Funzionamento delle operazioni come se l'elemento di destinazione è il componente.

È possibile creare una direttiva con prototipo di unione nella soluzione di modello componente.Se si compila e si esegue la soluzione originale, è necessario verificare che gli utenti possono trascinare qualsiasi numero porta d'ingresso o porta di output elementi da Casella degli strumenti a un oggetto componente elemento.Tuttavia, non possono trascinare una porta a una porta esistente.il puntatore non disponibile li avvisa che questo movimento non è abilitato.Tuttavia, poter creare una direttiva con prototipo di unione in modo da una porta in modo non intenzionale rilasciati su un oggetto esistente porta d'ingresso viene inoltrato a componente elemento.

Per creare una direttiva con prototipo di unione

  1. Creare un oggetto Domain-Specific Language Tools soluzione utilizzando il modello di modello componente.

  2. Visualizzare DSL Esplora Risorse aprendo DslDefinition.dsl.

  3. in DSL Esplora Risorseespandere, classi di dominio.

  4. ComponentPort la classe di dominio astratta è la classe base di entrambi InPort e OutPort.Fare clic con il pulsante destro del mouse ComponentPort quindi scegliere Aggiungere la nuova direttiva di unione dell'elemento.

    un nuovo Direttiva di unione dell'elemento il nodo viene visualizzato sotto Direttive di unione dell'elemento nodo.

  5. selezionare Direttiva di unione dell'elemento il nodo e apre Dettagli DSL finestra.

  6. Nell'elenco delle classi di indicizzazione, selezionare ComponentPort.

  7. selezionato Inoltrare l'unione a una classe di dominio diverso.

  8. Nell'elenco di selezione del percorso, espandere ComponentPortespandere, ComponentHasPortsquindi selezionare componente.

    Il nuovo percorso deve essere analogo al seguente:

    ComponentHasPorts.Component/! componente

  9. Salvare la soluzione e quindi trasformare i modelli facendo clic sul pulsante a destra in Esplora soluzioni barra degli strumenti.

  10. Compilare ed eseguire la soluzione.una nuova istanza di Visual Studio verrà visualizzata la.

  11. in Esplora soluzioni, Sample.mydsl aperto.il diagramma e Casella degli strumenti di ComponentLanguage visualizzare.

  12. trascinare porta d'ingresso da Casella degli strumenti a un altro porta d'ingresso. Successivamente, trascinare OutputPort in InputPort quindi a un altro OutputPort.

    Non è possibile vedere il puntatore non disponibile ed è possibile rilasciare il nuovo porta d'ingresso in quella esistente.selezionare il nuovo porta d'ingresso e trascinarla in un altro punto del componente.

Vedere anche

Concetti

Esplorazione e aggiornamento di un modello nel codice del programma

Personalizzazione di strumenti e della casella degli strumenti

Altre risorse

Esempio DSL degli schemi circuitali