Přizpůsobení vytvoření prvku a pohyb
Můžete povolit prvek přetáhnout z panelu nástrojů nebo vložením do jiného, nebo přesunout operaci.Můžete mít přesunuté prvky spojené s prvky cíl pomocí relace, které zadáte.
Direktivu korespondence prvek (EMD) určuje, co se stane, když je jeden prvek modelu sloučené do jiného prvku modelu.V takovém případě:
Uživatel přetáhne ze sady nástrojů na diagram nebo obrazce.
Uživatel vytvoří element pomocí nabídky přidat Průzkumník nebo obrazec prostoru.
Uživatel přesune do jiné položky z jedné dráze.
Uživatel vloží prvek.
Program kód volá směrnice korespondence prvek.
Ačkoli vytvoření operací může být odlišná od operace kopírování, skutečně pracují stejným způsobem.Při přidání prvku, například z panelu nástrojů prototypu je replikována.Prototyp je sloučený model stejným způsobem jako prvky, které byly zkopírovány z jiné části modelu.
Odpovědnost EMD se rozhodnout, jak objekt nebo skupinu objektů má být sloučena do určitého umístění v modelu.Zejména rozhodne, jaké vztahy by vytvořené sloučené skupiny propojení do modelu.Můžete také upravit jeho vlastnosti a vytvořit další objekty.
Role prvku sloučit směrnice
EMD je vytvořen automaticky při definování vkládání vztah.Toto výchozí nastavení EMD vytvoří instanci vztah, když uživatelé přidávat nové podřízené instance nadřazeného.Tyto výchozí EMDs můžete například upravit přidáním vlastního kódu.
Můžete také přidat vlastní EMDs v definici DSL umožníte uživatelům přetáhnout nebo vložit různé kombinace příjem a sloučené třídy.
Definování direktivu prvek korespondence
Třídy domény domény vztahy, tvary, konektory a diagramy můžete přidat prvek sloučení směrnic.Můžete přidat nebo je najít DSL Explorer ve třídě přijímající domény.Přijímací třídy je třída domény prvku, který je již v modelu a na které budou sloučeny nové nebo zkopírované prvek.
Indexování třídy je třída prvků, které mohou být sloučeny do členy přijímací třídy domény.Instancí podtřídy třídy indexování bude také sloučeny v tomto EMD Pokud nenastavíte platí pro podtřídy na hodnotu False.
Existují dva druhy směrnice korespondence:
A Proces sloučení směrnice určuje vztahy, podle kterých by měly být propojeny nového prvku do stromu.
A Vpřed sloučit směrnice přesměruje na jiný prvek přijímající, obvykle nadřazené nový prvek.
Můžete přidat vlastní kód sloučení směrnic:
Nastavit používá vlastní přijmout přidání vlastního kódu určit, zda by konkrétní instanci prvku indexování sloučena cílový prvek.Když uživatel přetáhne z panelu nástrojů, "neplatné" ukazatele ukazuje, pokud kód neumožňuje hromadné korespondence.
Například by mohla umožnit sloučení, pouze pokud je přijímající prvku v určitém stavu.
Nastavit používá vlastní korespondence přidat poskytují vlastní kód pro definování změny provedené do modelu při hromadné korespondenci.
Například můžete nastavit vlastnosti prvku sloučených pomocí dat z nového umístění v modelu.
[!POZNÁMKA]
Pokud píšete kód vlastní korespondence, ovlivní pouze sloučení, které jsou prováděny pomocí tohoto EMD.Pokud existují jiné EMDs, které sloučit stejný typ objektu nebo je další vlastní kód, který vytváří tyto objekty bez použití EMD, pak jejich se neovlivní kód vlastní korespondence.
Pokud chcete nový prvek nebo nový vztah je vždy zpracování pomocí vlastního kódu, zvažte možnost definování AddRule na vkládání vztahu a DeleteRule prvku třídy domény.Další informace naleznete v tématu Pravidla rozšířit změny v rámci modelu.
Příklad: Definování EMD bez vlastního kódu
Následující příklad umožňuje uživatelům vytvářet prvek a konektor současně přetažením ze sady nástrojů na existující obrazce.V příkladu přidá EMD definice DSL.Před tuto změnu uživatele přetažením nástroje do diagramu, ale není na existující obrazce.
Uživatelům můžete také vložit prvků na další prvky.
Umožníte uživatelům současně vytvořit prvek a konektor
Vytvořit nové připojení DSL Minimální jazyk roztok šablony.
Při spuštění tohoto DSL umožňuje vytváření obrazců a spojnic mezi obrazci.Nelze přetáhnout nový ExampleElement tvaru z panelu nástrojů na existující obrazec.
Umožníte uživatelům slučování prvků na ExampleElement tvary, vytvořit nové EMD v ExampleElement třídy domény:
V DSL Explorer, rozbalte položku Třídy domény.Pravým tlačítkem myši na ExampleElement a klepněte na tlačítko Přidat nový prvek sloučit směrnice.
Ujistěte se, že Podrobnosti DSL je otevřeno, takže můžete zobrazit podrobnosti o nové EMD.(Nabídka: zobrazení, Windows, Podrobnosti DSL.)
Nastavit indexování třídy v okně podrobností DSL definovat, jaké třídy prvků mohou být sloučeny do ExampleElement objektů.
Vyberte například ExampleElementstak, aby uživatel můžete přetáhnout nové prvky existujících prvků.
Všimněte si, že třída indexování bude název EMD v aplikaci Explorer DSL.
Pod procesu hromadné korespondence pomocí propojení, přidat dvě cesty:
Jedna cesta propojí nového prvku nadřazeného modelu.Cestu výraz, který je nutné zadat přejde z existujícího prvku nahoru přes vkládání vztah nadřazeného modelu.Nakonec Určuje roli v nové propojení, ke kterému bude přiřazen nový prvek.Cesta je následující:
ExampleModelHasElements.ExampleModel/!ExampleModel/.Elements
Druhé cesty propojí nový element existujícího elementu.Výraz cesty určuje referenční vztah a role, ke kterému bude přiřazen nový prvek.Tato cesta je následující:
ExampleElementReferencesTargets.Sources
Nástroj navigační cesty můžete vytvořit jednotlivé cesty:
Pod procesu hromadné korespondence vytvořením odkazů na cesty, klepněte na tlačítko < přidejte cestu >.
Klepněte šipku vpravo od položky seznamu.Zobrazí se v zobrazení stromu.
Rozbalte uzly ve stromové struktuře formuláře, kterou chcete zadat cestu.
Modem DSL testování:
Stisknutím klávesy F5 znovu sestavit a spustit řešení.
Opětovné sestavení bude trvat déle než obvykle, protože generovaný kód bude aktualizován text šablony s novou definici DSL.
Při experimentální instance Visual Studio byla spuštěna, otevřete soubor modelu vaší DSL.Vytvořte některé prvky příklad.
Přetáhněte z Příkladu prvek na existující obrazec nástroj.
Nový tvar se objeví a je propojen s konektorem existujícího obrazce.
Kopírovat existující obrazce.Vyberte jiný tvar a vložit.
Je vytvořena kopie prvního obrazce.Má nový název a je propojen s konektorem druhého obrazce.
Všimněte si následující body z tohoto postupu:
Vytváření prvku sloučení směrnic můžete povolit libovolné třídy prvku přijmout jakékoli jiné.EMD je vytvořen ve třídě přijímající domény a je určeno třídy přijaté domény indexu třídy pole.
Definování cest můžete určit, jaké odkazy by měly použít k připojení k existující model nový prvek.
Odkazy, které zadáte, by měly zahrnovat vložení n.
EMD ovlivňuje vytvoření nástrojů a také vložit operace.
Můžete psát vlastní kód, který vytvoří nové prvky, je EMD vyvolat explicitně pomocí ElementOperations.Merge metoda.Tím zajistíte, že kód propojí nové prvky do modelu stejným způsobem jako jiné operace.Další informace naleznete v tématu Přizpůsobení chování kopie.
Příklad: Přidání EMD přijímat vlastní kód
Přidáním vlastního kódu EMD lze definovat složitější způsob sloučení.Tento jednoduchý příklad zabrání uživateli v přidání více než pevný počet prvků do diagramu.V příkladu upraví výchozí EMD, který doprovází vkládání vztah.
Přijmout vlastní kód omezit, co uživatel může přidat zápis
Vytvořit pomocí DSL Minimální jazyk roztok šablony.Otevřete diagram definice DSL.
V aplikaci Explorer DSL, rozbalte položku Třídy domény, ExampleModel, Prvek sloučení směrnic.Vyberte směrnice korespondence prvek s názvem ExampleElement.
Tento EMD řídí, jak může uživatel vytvořit nový ExampleElement objektů v modelu, například přetažením z panelu nástrojů.
V Podrobnosti DSL vyberte používá vlastní přijmout.
Znovu vytvořte řešení.To bude trvat déle než obvykle, protože generovaný kód bude aktualizován z modelu.
Chyba sestavení budou hlášeny, podobné: "Company.ElementMergeSample.ExampleElement neobsahuje definici pro CanMergeExampleElement…"
Musí implementovat metodu CanMergeExampleElement.
Vytvořit nový soubor v kódu Dsl projektu.Nahraďte následující kód jeho obsahu a změnit obor názvů do projektu obor názvů.
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; } } }
Tento jednoduchý příklad omezuje počet prvků, které mohou být sloučeny do nadřazeného modelu.Zajímavější podmínky lze kontrolovat způsob odkazy přijímající objekt a všechny vlastnosti.Můžete také zkontrolovat vlastnosti slučování prvků, které jsou v ElementGroupPrototype.Pro více informací o ElementGroupPrototypes si prohlédněte Přizpůsobení chování kopie.Další informace o tom, jak napsat kód, který čte model, viz Navigace a aktualizace modelu v kódu programu.
Modem DSL testování:
Stisknutím klávesy F5 znovu vytvořit řešení.Při experimentální instance Visual Studio otevře otevřít instanci vaše DSL.
Nové prvky vytvořte několika způsoby:
Přetáhněte z Příkladu prvek nástroj do diagramu.
V Například Průzkumník modelu, klepněte pravým tlačítkem myši na kořenový uzel a potom klepněte na tlačítko Přidat nový prvek příklad.
Zkopírujte a vložte prvek v diagramu.
Ověřte, že nelze použít tyto způsoby přidání více než čtyři prvky modelu.Je to proto, že všechny používají směrnice prvek sloučit.
Příklad: Přidání EMD sloučit vlastní kód
Vlastní korespondence kódu můžete definovat, co se stane, když uživatel přetáhne nástroj nebo vloží element.Definovat vlastní korespondence dvěma způsoby:
Nastavit Používá vlastní sloučit a zadat požadovaný kód.Kód nahrazuje kód generovaný korespondence.Tuto možnost použijte, pokud chcete zcela předefinovat nemá hromadné korespondence.
Přepsat MergeRelate metodou a volitelně MergeDisconnect metoda.Chcete-li to provést, je nutné nastavit Generuje dvojité odvozené vlastnost třídy domény.Kód můžete volat kód generovaný korespondence v základní třídě.Tuto možnost použijte, chcete-li provádět další operace po sloučení byla provedena.
Tyto přístupy mají vliv pouze na sloučení, které jsou prováděny pomocí tohoto EMD.Pokud chcete ovlivnit všechny způsoby, v nichž lze vytvořit sloučené prvek, je definovat alternativu AddRule na vkládání vztahu a DeleteRule na třídě sloučené domény.Další informace naleznete v tématu Pravidla rozšířit změny v rámci modelu.
Potlačit MergeRelate
V definici DSL Přesvědčte se, zda jste definovali EMD, ke kterému chcete přidat kód.Pokud chcete, můžete přidat cesty a definovat vlastní kód přijmout, popsané v předchozích částech.
V DslDefinition diagramu vyberte přijímací třídy hromadné korespondence.Obvykle je třída na konci zdroj vkládání vztah.
Například v DSL, generovaných z roztoku minimální jazyk, vyberte ExampleModel.
V Vlastnosti nastavit okno, Generuje dvojité odvozené na true.
Znovu vytvořte řešení.
Zkontrolovat obsah Dsl\Generated Files\DomainClasses.cs.Vyhledání metod s názvem MergeRelate a zkontrolujte jejich obsah.To vám umožní zapsat vlastní verze.
V novém souboru kód zapsat částečné třídy pro přijímající třídy a přepsat MergeRelate metoda.Nezapomeňte volání základní metody.Příklad:
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(); } } }
Zápis sloučení vlastní kód
V Dsl\Generated Code\DomainClasses.cs, kontrolovat metod s názvem MergeRelate.Tyto metody vytvořit propojení mezi prvkem nové a existující model.
Také kontrolovat metod s názvem MergeDisconnect.Tyto metody zrušit prvek z modelu po odstranění.
V DSL Explorer, vyberte nebo vytvořte sloučit směrnice prvek, který chcete upravit.V Podrobnosti DSL nastavit okno, Používá vlastní sloučit.
Nastavíte-li tuto možnost Proces sloučení a Vpřed sloučit možnosti ignorovány.V kódu je použita.
Znovu vytvořte řešení.Bude trvat déle než obvykle, protože soubory generovaný kód bude aktualizován z modelu.
Zobrazí se chybové zprávy.Poklepejte na položku chybové zprávy zobrazíte pokyny do generovaného kódu.Tyto pokyny vás vyzve k zadání dvou metod MergeRelateYourDomainClass a MergeDisconnectYourDomainClass
Metody zápisu v definici dílčí třídy v souboru samostatný kód.Je třeba navrhnout příklady, které inspekce v dříve.
Kód vlastní korespondence neovlivní kód, který vytváří objekty a vztahy přímo a neovlivní ostatní EMDs.Ujistěte se, že další změny jsou prováděny bez ohledu na způsob vytvoření prvku, zvažte možnost zápisu AddRule a DeleteRule místo.Další informace naleznete v tématu Pravidla rozšířit změny v rámci modelu.
Přesměrování operace sloučení
Směrnice dopředu korespondence přesměruje cíl operace sloučení.Nový cíl je obvykle vkládání nadřazené počáteční cíl.
V DSL, který byl vytvořen pomocí šablony diagram komponent, například porty jsou vloženy v součásti.Porty jsou zobrazeny jako malé obrazce na okraj obrazce součást.Uživatel vytvoří nástroj Port přetažením obrazce součást porty.Ale někdy omylem přetažena nástroj Port existující port namísto komponenty, a operace se nezdaří.To je snadný chybu při několika stávajících portů.Chcete-li uživateli zabránit této nepříjemnosti, můžete povolit porty, být přetažena na existující port, ale akce přesměrována do nadřazené komponenty.Operace funguje, jako kdyby byl cílový prvek komponenty.
Směrnice dopředu korespondence můžete vytvořit v roztoku komponentu modelu.Kompilace a spuštění původního řešení, zobrazí uživateli přetáhnout libovolný počet Vstupní Port nebo Výstupní Port prvky z nástrojů do součást prvku.Port jsou však nelze přetáhnout do existujícího portu.K dispozici ukazatele je upozornění, že tento přesun není povolena.Však vytvořit směrnice korespondence dopředu tak, že port je neúmyslně umístěný na existující Vstupní Port předán součást prvku.
Vytvoření dopředného korespondence směrnice
Vytvoření Jazykové nástroje specifické pro doménu řešení pomocí šablony součásti modelu.
Zobrazení DSL Explorer otevřením DslDefinition.dsl.
V DSL Explorer, rozbalte položku Třídy domény.
ComponentPort domény abstraktní třídy je základní třída obou InPort a OutPort.Pravým tlačítkem myši na ComponentPort a klepněte na tlačítko Přidat nový prvek sloučit směrnice.
Nový Prvek sloučit směrnice uzel zobrazen pod Prvek sloučení směrnic uzel.
Vyberte Prvek sloučit směrnice uzel a otevřít Podrobnosti DSL okna.
Vyberte v seznamu indexování třídy ComponentPort.
Vyberte dál sloučit do jiné domény třídy.
V seznamu pro výběr cesty, rozbalte položku ComponentPort, rozbalte položku ComponentHasPortsa pak vyberte součást.
Nová cesta by měla vypadat tohoto:
ComponentHasPorts.Component/!Součást
Uložit roztoku a poté klepnutím na tlačítko vpravo v transformaci šablony Aplikaci Solution Explorer nástrojů.
Sestavit a spustit řešení.Nové instance Visual Studio se zobrazí.
V Aplikaci Solution Explorer, Sample.mydsl otevřít.Diagram a ComponentLanguage nástrojů se zobrazí.
Přetáhněte Vstupní Port z nástrojů do jiného Vstupního portu. Potom přetáhněte OutputPort k InputPort a poté do jiného OutputPort.
Není zobrazí dostupné ukazatele a by měla být schopna umístit nové Vstupní Port na existující.Vyberte novou Vstupní Port a přetáhněte jej na jiné místo součást.
Viz také
Koncepty
Navigace a aktualizace modelu v kódu programu
Vlastní nastavení nástroje a panelu nástrojů