Anpassen der Elementerstellung und -verschiebung
Sie können ein auf andere entweder aus der Toolbox gezogen Einfügen oder in einer Element kann oder Verschiebungsvorgang.Sie können die verschobenen Elemente aufweisen, die den Zielelementen anhand der Beziehungen verknüpft sind, die Sie angeben.
Element zusammengeführt EMD Directive () geben an, was geschieht, wenn ein Modellelement in ein anderes Modellelement zusammengeführt wird.Dies ist der Fall, wenn:
Die Benutzer zieh aus der Toolbox in das Diagramm oder eine Form.
Der Benutzer wird ein Element erstellt, indem er ein im Menü Hinzufügen im Explorer oder in einem Depot Form verwendet.
Der Benutzer ändert ein Element aus einem swimlane in eine andere.
Der Benutzer fügt ein - Element ein.
Der Programmcode ruft die einzelnen Direktiven zusammengeführt.
Obwohl die Erstellung kann Vorgänge schienen, Kopiervorgängen unterschiedlich sein, sie funktionieren gleichermaßen.Wenn ein Element hinzugefügt wird, z. B. aus der Toolbox wird ein Prototyp davon repliziert.Der Prototyp wird in das Modell auf dieselbe Weise wie Elemente zusammengeführt, die von einem anderen Teil des Modells kopiert wurden.
Die Aufgabe eines EMD ist, zu entscheiden, wie ein Objekt oder eine Gruppe von Objekten an einer bestimmten Position im Modell zusammengeführt werden sollen.Insbesondere entscheidet, welche Beziehungen instanziiert werden sollen, um die zusammengeführte Gruppe in das Modell verknüpfen.Sie können sie auch anpassen, um Eigenschaften festzulegen und zusätzliche Objekte zu erstellen.
Die Rolle Element-Merge-Direktive
Ein EMD wird automatisch generiert, wenn Sie ein Einbettungs-Verhältnis definieren.Dieser Standard EMD erstellt eine Instanz der Beziehung, wenn Benutzer neue untergeordnete Instanzen dem übergeordneten Element hinzufügen.Sie können diese Standardeinstellung ändern, EMDs z. B. indem Sie benutzerdefinierten Code hinzufügen.
Sie können auch hinzufügen, EMDs in der DSL-Definition besitzen, um Benutzer zu ziehen oder verschiedene Kombinationen von zusammengeführten und empfangenden Klasse eingefügt werden soll.
Definieren Element-Merge-Direktive
Sie können Klassen für Domänen Directive Element zusammengeführt, Domänen-Verhältnissen, Formen und Konnektoren Diagramme hinzufügen.Sie können sie in DSL-Explorer unter der empfangenden Domänenklasse hinzufügen oder durchsuchen.Die empfangende Klasse ist die Domänenklasse des Elements, das bereits im Modell basiert, und ein, das das neue Element kopiert oder zusammengeführt wird.
Indizierungsklasse ist die Domänenklasse von Elementen, die in Member der empfangenden Klasse zusammengeführt werden können.Instanzen von Unterklassen der Indizierungs-Klasse werden ebenfalls durch dieses EMD, es sei denn, Sie Gilt für Unterklassen auf False festlegen zusammengeführt.
Es gibt zwei Arten von Führt Direktiven:
Zusammenführung verarbeiten-Direktiven geben die Beziehungen an, durch die das neue Element in die Struktur verknüpft werden soll.
Zusammenführung weiterleiten-Direktive leiten das neue Element zu einem anderen empfangenden Element (in der Regel ein übergeordnetes Element.
Sie können direktiven Führt benutzerdefinierten Code hinzufügen:
Legen Sie Verwendet benutzerdefiniertes Akzeptieren fest, um den eigenen Code hinzufügen, um zu bestimmen, ob eine bestimmte Instanz des Indizierungs Elements in das Zielelement zusammengeführt werden soll.Wenn der Benutzer zieh aus der Toolbox mit dem Namen „Ungültige“ Zeiger darstellt, wenn der Code die Zusammenführung nicht zulässig.
Beispielsweise könnten Sie können die Zusammenführung nur, wenn die empfangende Element in einem bestimmten Zustand befindet.
Legen Sie fest Verwendet benutzerdefiniertes Zusammenführen hinzuzufügenden eigenen Code bereitstellen, um die Änderungen zu definieren, die am Modell vorgenommen werden, wenn die Zusammenführung ausgeführt werden.
Sie können beispielsweise Eigenschaften im zusammengeführten Element festlegen, indem Sie Daten aus seiner neuen Position im Modell frei.
Hinweis |
---|
Wenn Sie benutzerdefinierten Code schreiben Zusammenführen beeinflusst nur zusammengeführt, die ausgeführt werden, indem diese EMD verwendet.Sind andere EMDs gibt, die denselben Objekttyp zusammenführen, oder wenn er anderen benutzerdefinierten Code, der diese Objekte erstellt, ohne die EMD zu verwenden, sind sie nicht durch den benutzerdefinierten Code für Zusammenführen beeinflusst. Wenn Sie sicherstellen möchten, dass ein neues Element oder eine neue Beziehung immer durch den benutzerdefinierten Code verarbeitet wird, sollten Sie AddRule auf dem Einbettungs-Verhältnis und auf der DeleteRule Domänenklasse des Elements zu definieren.Weitere Informationen finden Sie unter Regeln propagieren Änderungen im Modell . |
Beispiel: Ein EMD ohne benutzerdefinierten Code definieren
Im folgenden Beispiel können Benutzer ein Element und einen Konnektor gleichzeitig erstellen, indem Sie von der Toolbox auf eine vorhandene Form ziehen.Im Beispiel wird ein EMD der DSL-Definition hinzu.Vor dieser Änderung können Benutzer Tools auf das Diagramm, jedoch nicht auf vorhandene Forms ziehen.
Benutzer können Elemente auch auf andere Elemente eingefügt werden.
Um Benutzer ein Element und einen Konnektor gleichzeitig erstellt werden können
Erstellen Sie ein neues DSL, indem Sie die Vorlage Minimale Sprache Projektmappen verwenden.
Wenn Sie dieses DSL ausführen, können sie von Formen und Konnektoren zwischen Formen erstellen.Sie können eine neue ExampleElement Form von der Toolbox auf eine nicht vorhandene Form ziehen.
Damit Benutzer Elemente in ExampleElement Forms zusammenführen können, erstellen Sie ein neues EMD in der ExampleElement Domänenklasse:
In DSL-Explorererweitern Sie Domänenklassen.Klicken Sie mit der rechten Maustaste auf ExampleElement , und klicken Sie dann auf Neue Element-Merge-Direktive hinzufügen.
Überprüfen Sie, ob das DSL-Details Fenster geöffnet wird, sodass Sie die Details des neuen EMD sehen können.(Menü): Ansicht, Weitere Fenster, DSL-Details).
Legen Sie im Fenster DSL-Detail Indizierungsklasse fest), die definiert, welche Klasse von Elementen auf ExampleElement-Objekten zusammengeführt werden kann.
Wählen Sie für dieses Beispiel ExampleElementsaus, damit der Benutzer neue Elemente auf vorhandene Elemente ziehen kann.
Beachten Sie, dass die Indizierungs class der Name des EMD in DSL-Explorer wird.
Die Zusammenführung durch Erstellung von Links verarbeitenfügen Sie zwei Pfade hinzu:
Ein Pfad verknüpft das neue Element auf das übergeordnete Modell.Der Pfad Ausdruck, den Sie eingeben müssen, wird aus dem vorhandenen Element, durch das oben Einbettungs-Verhältnis auf das übergeordnete Modell.Schließlich gibt es die Rolle im neuen Link an, an dem das neue Element zugewiesen ist.Der Pfad lautet wie folgt:
ExampleModelHasElements.ExampleModel/!ExampleModel/.Elements
Der andere Pfad verknüpft das neue Element dem vorhandenen Element.Der Pfad Ausdruck gibt das Bezugs-Verhältnis und die Rolle aufgeführt, zu denen das neue Element zugewiesen ist.Dieser Pfad lautet wie folgt:
ExampleElementReferencesTargets.Sources
Sie können das Tool navigations Pfad verwenden, um einen Pfad zu erstellen:
Klicken Sie auf Zusammenführung durch Erstellung von Links bei Pfaden verarbeiten <add path> .
Klicken Sie auf den Dropdownpfeil rechts des Listenelements.Eine Strukturansicht angezeigt wird.
Erweitern Sie die Knoten in der Struktur, um den Pfad zu bilden, den Sie angeben möchten.
Testen Sie das DSL:
Drücken Sie F5, um die Lösung zu erstellen und auszuführen.
Das Neuerstellen dauert länger als üblich, da der generierte Code von Textvorlagen aktualisiert wird, an die neue DSL-Definition anzupassen.
Wenn die experimentelle Instanz von Visual Studio gestartet wurde, öffnen Sie eine Modelldatei des DSL.Erstellen Sie einige Beispiele von Elementen.
Ziehen Sie aus dem Beispielelement Tool auf eine vorhandene Form.
Eine neue Form angezeigt und es wird der bestehenden Formular mit einem Konnektor verknüpft.
Kopieren Sie eine vorhandene Form.Wählen Sie eine andere Form aus, und fügen Sie diese.
Eine Kopie der ersten Form wird erstellt.Sie verfügt über einen neuen Namen und wird an die zweite Form mit einem Konnektor verknüpft.
Beachten Sie die folgenden Punkte von dieser Prozedur:
Mit Element-Merge-Direktive erstellen, können Sie alle Klassen können ein beliebiges anderes Element zu übernehmen.Das EMD wird in der empfangenden Domänenklasse erstellt, und die akzeptierte Domänenklasse wird auf dem Indexklasse Feld angegeben.
Wenn Sie Pfade definieren, können Sie angeben, welche sollte verwendet werden, um das neue Element in das vorhandene Modell herzustellen.
Die Links, die Sie angeben, sollte ein einbettendes Beziehung enthalten.
Das EMD Builds beeinflusst auch aus der Toolbox, und Einfügevorgänge.
Wenn Sie benutzerdefinierten Code schreiben, der neue Elemente erstellen, können Sie das EMD explizit aufrufen, indem Sie die ElementOperations.Merge-Methode verwenden.Dadurch wird sichergestellt, dass der Code neue Elemente im Modell auf die gleiche Weise wie andere Operationen verknüpft.Weitere Informationen finden Sie unter Anpassen des Kopierverhaltens.
Beispiel: Beim Hinzufügen von benutzerdefinierten Akzeptieren von Code zu einem EMD
Mit einem benutzerdefinierten Code hinzufügen, können Sie EMD Zusammenführung komplexeres Verhalten definieren.Dieses einfache Beispiel wird verhindert, dass Hinzufügen der Benutzer mehr als eine feste Anzahl von Elementen für das Diagramm.Im Beispiel wird der Standardwert EMD, der ein Einbettungs-Verhältnis begleitet.
Zum Schreiben von benutzerdefinierten Übernehmen Sie den der Benutzer einzuschränken um Code hinzugefügt werden kann
Erstellen Sie ein DSL, indem Sie die Vorlage Minimale Sprache Projektmappen verwenden.Öffnen Sie das Diagramm DSL-Definitions.
In DSL-Explorer erweitern Sie Domänenklassen, ExampleModel, Elementzusammenführungsdirektiven.Wählen Sie die einzelnen Direktiven aus, die ExampleElementzusammengeführt.
Dieses EMD-Kontrollen, wie der Benutzer neue ExampleElement-Objekte im Modell erstellen kann, z. B. durch das Ziehen von der Toolbox auf die Seite.
Wählen Sie im Fenster DSL-DetailsVerwendet benutzerdefiniertes Akzeptieren.
Generieren Sie die Projektmappe neu.Dies dauert länger als üblich, da der generierte Code aus dem Modell aktualisiert wird.
Ein Buildfehler gemeldet wird, ähnlich: „Company.ElementMergeSample.ExampleElement enthält keine Definition für CanMergeExampleElement“…
Sie müssen die Methode CanMergeExampleElementimplementieren.
Erstellen Sie eine neue Codedatei im Dsl Projekt.Ersetzen Sie den Inhalt durch den folgenden Code, und ändern Sie den Namespace dem Namespace des Projekts.
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; } } }
Dieses einfache Beispiel schränkt die Anzahl von Elementen, die in das Modell des übergeordneten Elements eingefügt werden können.Eine interessantere Bedingungen kann die Methode eine der Eigenschaften und Links vom empfangenden Objekts überprüfen.Es kann die Eigenschaften der zusammenführenden Elemente auch überprüfen, die in ElementGroupPrototypeübertragen werden.Weitere Informationen zu ElementGroupPrototypes finden Sie unter Anpassen des Kopierverhaltens.Weitere Informationen dazu, wie Code, mit dem ein Modell gelesen wird, finden Sie unter Navigieren in und Aktualisieren von Modellen im Programmcodeschreibt.
Testen Sie das DSL:
Drücken Sie F5, um die Projektmappe zu erstellen.Wenn die experimentelle Instanz von Visual Studio geöffnet, öffnen Sie eine Instanz des DSL.
Erstellen Sie neue Elemente in mehrfacher Hinsicht:
Ziehen Sie aus dem Beispielelement Tool auf das Diagramm.
In Beispiel-Modell-Explorermit der rechten Maustaste auf den Stammknoten, und klicken Sie dann auf Neues Beispielelement hinzufügen.
Kopieren und Einfügen ein Element im Diagramm.
Stellen Sie sicher, dass Sie alle Methoden können nicht mehr als vier dem Modell Elemente hinzufügen.Dies liegt daran, dass alle Element-Merge-Direktive verwenden.
Beispiel: Benutzerdefinierten Zusammenführen von Code zu einem EMD hinzu
Im benutzerdefinierten Zusammenführen von Code können Sie definieren, was geschieht, wenn der Benutzer ein Tool ziehen oder auf ein Element eingefügt wird.Es gibt zwei Möglichkeiten, benutzerdefinierte Zusammenführung zu definieren:
Legen Sie fest Verwendet benutzerdefiniertes Zusammenführen und geben Sie den erforderlichen Code.Der Code ersetzt den generierten Code für das Zusammenführen.Verwenden Sie diese Option, wenn Sie völlig neu definieren möchten, was die Zusammenführung erfolgen.
Überschreiben Sie die MergeRelate-Methode und optional die MergeDisconnect-Methode.Dazu müssen Sie die Generiert abgeleitetes Double Domänenklasse der Eigenschaft festlegen.Der Code kann den generierten Zusammenführen von Code in der Basisklasse aufrufen.Verwenden Sie diese Option, wenn Sie weitere Vorgänge ausführen möchten, nachdem die Zusammenführung ausgeführt wurden.
Diese Auswirkungen der Ansätze nur zusammengeführt, die ausgeführt werden, indem diese EMD verwendet.Wenn Sie alle Methoden beeinflussen möchten, in denen das zusammengeführte Element erstellt werden kann, handelt es sich um eine Alternative, AddRule auf dem Einbettungs-Verhältnis und DeleteRule für die zusammengeführten Domänenklasse zu definieren.Weitere Informationen finden Sie unter Regeln propagieren Änderungen im Modell .
So überschreiben MergeRelate
In der DSL-Definition stellen Sie sicher, dass Sie das EMD definiert haben, dem Sie Code hinzufügen möchten.Bei Bedarf können Sie benutzerdefinierte hinzufügen und Pfade zu definieren, übernehmen Sie Code, wie in den vorherigen Abschnitten beschrieben.
Wählen Sie im DslDefinitions-Diagramm der empfangenden Klasse der Zusammenführung aus.In der Regel ist dies die Klasse am Quellende eines Einbettungs-Verhältnisses.
Beispielsweise kann in einem DSL generiert der minimalen Sprachen die Option Projektmappe ExampleModel.
Legen Sie im Fenster Eigenschaftentruezu Generiert abgeleitetes Double fest.
Generieren Sie die Projektmappe neu.
Überprüfen Sie den Inhalt Dsl\Generated Files\DomainClasses.cs.Suche nach der Methoden, die MergeRelate und ihren Inhalt überprüfen.Dies hilft Ihnen zu schreiben, Versionen verfügen.
In einer neuen Codedatei schreiben Sie eine partielle Klasse für die empfangende Klasse, und überschreiben Sie die MergeRelate-Methode.Denken Sie daran, die Basismethode aufrufen.Beispiele:
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(); } } }
So fügen Sie benutzerdefinierten Code schreiben Merge
In Dsl\Generated Code\DomainClasses.csüberprüfen Sie die Methoden, die MergeRelatebenannt werden.Diese Methoden stellen Verbindungen zwischen einem neuen Element und dem vorhandenen Modell erstellt.
Außerdem überprüfen Sie die Methoden, die MergeDisconnectbenannt werden.Diese Methoden lösen ein Element aus dem Modell, wenn sie gelöscht werden soll.
In DSL-Explorerwählen Sie aus, oder erstellen Sie die Element-Merge-Direktive, die Sie anpassen möchten.Legen Sie im Fenster DSL-Details fest. Verwendet benutzerdefiniertes Zusammenführen
Wenn Sie legen diese Option, um den Zusammenführung verarbeiten und Zusammenführung weiterleiten Optionen ignoriert werden.Der Code wird stattdessen verwendet.
Generieren Sie die Projektmappe neu.Es dauert länger als üblich, da die generierten Codedateien vom Modell aktualisiert werden.
Fehlermeldungen angezeigt werden.Doppelklicken Sie auf die Fehlermeldungen, um die Anweisungen im generierten Code anzuzeigen.Diese Anweisungen fordern Sie zwei Möglichkeiten, MergeRelateTheDomainClass und MergeDisconnectanzugebenTheDomainClass
Schreiben Sie die Methoden in einer partiellen Klassendefinition in einer eigenen Codedatei.Die Beispiele, die Sie zuvor aktivierten sollten vorschlagen, die Sie benötigen.
Benutzerdefinierter Code zusammenführen, hat dies keine Auswirkungen auf Code, in dem Objekte und Beziehungen direkt erstellt und hat keinen Einfluss auf andere EMDs.Um sicherzustellen, dass die zusätzlichen Änderungen implementiert werden, unabhängig davon, wie das Element erstellt wird, sollten Sie stattdessen DeleteRuleAddRule und zu schreiben.Weitere Informationen finden Sie unter Regeln propagieren Änderungen im Modell .
Umleiten einer Zusammenführung
Vorwärts Führt Direktiven leiten das Ziel der Zusammenführung.In der Regel ist das neue Ziel Mithilfe von eingebetteten das übergeordnete Element des ursprünglichen Zieles.
Beispielsweise kann in einem Komponentendiagramm DSL, das der Vorlage erstellt wurde, werden Anschlüsse in Komponenten enthalten.Anschlüsse werden als kleine Formen im Rahmen einer Komponente Form angezeigt.Der Benutzer stellt Ports, indem er das Tool Anschluss auf eine Komponente Form ziehen.Manchmal, zieht der Benutzer fälschlicherweise das Tool Anschluss auf einen vorhandenen Anschluss anstelle der Komponente, und der Vorgang schlägt fehl.Dies ist ein einfacher Fehler, wenn es mehrere vorhandene Ports vorhanden ist.Um dem Benutzer können diese Belästigung zu vermeiden, können Sie auf einen vorhandenen Port gezogen werden Anschlüssen ermöglichen, verfügen jedoch die Aktion, die der übergeordneten Komponente umgeleitet wird.Der Vorgang funktioniert, als ob das Zielelement die Komponente waren.
Sie können eine Zusammenführung vorne in der Direktiven TeilProjektmappe Modell erstellen.Wenn Sie die ursprüngliche Projektmappe zu kompilieren und ausführen, sollten Sie sehen, dass Benutzer eine Zahl Eingabeport oder Ausgabeport-Elemente aus Toolbox zu einem Komponente-Element ziehen können.Allerdings können sie einen Port nicht zu einem vorhandenen Port ziehen.Der Zeiger kann nicht benachrichtigt sie, dass die Verschiebung nicht aktiviert ist.Sie können jedoch vorwärts Führt Direktiven erstellen, damit ein Anschluss, der auf vorhandenen Eingabeport versehentlich gelöscht wird, wenn Komponente-Element weitergeleitet wird.
So erstellen Sie Direktiven Zusammenführung Vorwärts
Erstellen Sie eine Domänenspezifische Sprachtools Projektmappe, indem Sie die TeilVorlage des Modells verwenden.
Zeigen Sie DSL-Explorer an, indem Sie DslDefinition.dsl öffnen.
In DSL-Explorererweitern Sie Domänenklassen.
Die ComponentPort domänen abstrakte Klasse ist die Basisklasse von InPort und OutPort.Klicken Sie mit der rechten Maustaste auf ComponentPort , und klicken Sie dann auf Neue Element-Merge-Direktive hinzufügen.
Ein neuer ElementzusammenführungsdirektiveElementzusammenführungsdirektiven Knoten unter dem Knoten angezeigt wird.
Wählen Sie den Elementzusammenführungsdirektive Knoten aus, und öffnen Sie das DSL-Details Fenster.
Klicken Sie in der Liste ausgewähltes ComponentPortKlassen Indizierungs.
Wählen Sie Zusammenführung zu einer anderen Domänenklasse weiterleitenaus.
Erweitern Sie in der Liste Wegesuche ComponentPort, erweitern Sie ComponentHasPortsund wählen Sie dann Komponenteaus.
Der neue Pfad sollte diesem ähneln:
ComponentHasPorts.Component/! Komponente
Speichern Sie die Projektmappe, und dann die Vorlagen transformieren, indem Sie auf die Schaltfläche ganz rechts auf der Symbolleiste Projektmappen-Explorer klicken.
Erstellen Sie die Projektmappe, und führen Sie sie ausEine neue Instanz von Visual Studio angezeigt wird.
In Projektmappen-Exploreröffnen Sie Sample.mydsl.Das Diagramm und Toolbox ComponentLanguage angezeigt werden.
Ziehen Sie Eingabeport von Toolbox zu einem anderen Eingabeport. Ziehen Sie als Nächstes OutputPort zu InputPort und dann zu einem anderen OutputPort.
Sie sollten den Zeiger nicht verfügbar nicht angezeigt, und Sie sollten in der Lage sein, neue Eingabeport auf das vorhandene abzulegen.Wählen Sie Neue Eingabeport aus, und ziehen Sie es zu einem anderen Punkt auf Komponente.
Siehe auch
Konzepte
Navigieren in und Aktualisieren von Modellen im Programmcode
Anpassen der Tools und der Toolbox