Dostosowywanie tworzenia i przesuwania elementów
Można zezwolić na element, aby być przeciągnięty na inny, z przybornika lub pasty lub operacja przenoszenia.Może być przeniesione elementy połączone z elementów docelowych przy użyciu relacji, które można określić.
Element dyrektywy korespondencji seryjnej (EMD) określa, co się dzieje, gdy jest jednym z elementów modelu scalone do innego elementu modelu.Dzieje się tak podczas:
Użytkownik przeciągnie się z przybornika na diagramie lub kształt.
Użytkownik tworzy element przy użyciu menu Dodaj w Eksploratorze lub kształt Przedział.
Użytkownik przenosi element z jednego tor do innego.
Użytkownik wkleja element.
Kod programu wywołuje element dyrektywy korespondencji seryjnej.
Chociaż wydaje się, że operacje tworzenia może różnić się od operacji kopiowania, rzeczywiście pracują w taki sam sposób.Po dodaniu elementu, na przykład z przybornika, prototyp go jest replikowana.Prototyp scalone modelu w taki sam sposób jak elementy, które zostały skopiowane z innej części modelu.
Odpowiedzialność EMD jest zdecydować, jak scalone obiektu lub grupy obiektów w określonej lokalizacji w modelu.W szczególności decyduje, jakie relacje wystąpienia powinny być tworzone połączyć grupy scalone do modelu.Można również dostosować ustawić właściwości i utworzyć dodatkowe obiekty.
Rola dyrektywy scalić elementu
EMD jest generowany automatycznie podczas definiowania relacji osadzania.To ustawienie domyślne EMD tworzy wystąpienie relacji, gdy użytkownicy dodają nowe instancje podrzędnych do obiektu nadrzędnego.Te EMDs domyślne można zmodyfikować na przykład przez dodanie kodu niestandardowego.
Można również dodać własne EMDs w definicji DSL, aby umożliwić użytkownikom przeciągnij lub wkleić różne kombinacje klas scalone i odbierania.
Definiowanie dyrektywy korespondencji seryjnej elementu
Element korespondencji seryjnej dyrektyw można dodać do domeny klas, relacje między domenami, kształtów, łączniki i diagramów.Można dodać lub je znaleźć w Eksploratorze DSL pod otrzymującego klasy domeny.Odbiorczy klasa jest klasą domeny elementu, który jest już w modelu i na której element nowe lub skopiowane zostaną scalone.
Indeksowania klasy jest klasą domeny elementów, które mogą być scalone członkowie klasy otrzymującego.Wystąpienia podklas klasy indeksowania również zostaną scalone przez to EMD, chyba że ustawisz dotyczy podklasy na wartość False.
Istnieją dwa rodzaje dyrektywy korespondencji seryjnej:
A Proces scalania dyrektywy określa relacje, przez które powinien być łączony nowy element w drzewie.
A Do przodu scalić dyrektywy przekierowuje nowy element do innego elementu otrzymującego, zazwyczaj w nadrzędnej.
Można dodać kod niestandardowy do scalenia dyrektyw:
Ustaw zaakceptować niestandardowych zastosowań do dodawania kodu do ustalenia, czy konkretne wystąpienie elementu indeksowania powinny być scalone element docelowy.Gdy użytkownik przeciągnie się z przybornika, "nieprawidłowy" wskaźnik pokazuje, jeśli kod nie zezwala na korespondencji seryjnej.
Na przykład można zezwolić korespondencji seryjnej, tylko wtedy, gdy element odbierający jest w konkretnym Państwie.
Ustaw korzysta z seryjnej niestandardowy dodać dostarczyć własny kod w celu zdefiniowania zmian wprowadzonych w modelu podczas wykonywania korespondencji seryjnej.
Na przykład można ustawić właściwości w elemencie korespondencji seryjnej przy użyciu danych z nowej lokalizacji w modelu.
[!UWAGA]
Można napisać kod niestandardowy korespondencji seryjnej, dotyczy ona tylko scala, które są wykonywane przy użyciu tego EMD.Jeśli istnieją inne EMDs, które łączą się ten sam typ obiektu lub istnieje inny niestandardowy kod, który tworzy te obiekty bez korzystania z EMD, następnie ich nie dotyczy kodu niestandardowego w korespondencji seryjnej.
Aby upewnić się, że nowego elementu lub nowych relacji zawsze jest przetwarzany przez niego kod niestandardowy, należy rozważyć zdefiniowanie AddRule na relacji osadzania i DeleteRule na element domeny klasy.Aby uzyskać więcej informacji, zobacz Reguły propagujące zmiany w modelu.
Przykład: Definiowanie EMD bez kodu niestandardowego
Poniższy przykład pozwala użytkownikom na tworzenie elementu i łącznika w tym samym czasie, przeciągając je z przybornika na kształt istniejący.W przykładzie dodano EMD do definicji DSL.Zanim ta modyfikacja użytkownicy będą mogli przeciągać narzędzia na diagram, ale nie na istniejące kształty.
Użytkownikom można również wkleić elementy na inne elementy.
Aby pozwolić użytkownikom na tworzenie elementu i łącznika w tym samym czasie
Utwórz nowe DSL za pomocą Minimalne języka roztwór szablonu.
Po uruchomieniu tego DSL, umożliwia tworzenie kształtów i łączników między kształtami.Nie można przeciągnąć nowy ExampleElement z przybornika na kształt istniejący kształtu.
Aby umożliwić użytkownikom scalanie elementów na ExampleElement kształty, Utwórz nową EMD w ExampleElement klasy domeny:
W DSL Explorer, rozwiń węzeł Domeny klas.Kliknij prawym przyciskiem myszy ExampleElement , a następnie kliknij przycisk Dodaj nowy Element scalić dyrektywy.
Upewnij się, że Szczegóły DSL jest otwarte okno, tak, że można zobaczyć szczegółowe informacje o nowych EMD.(Menu: widoku, inne okna, Szczegóły DSL.)
Ustaw klasy indeksowania w oknie Szczegóły DSL w celu zdefiniowania klasy, jakie elementy mogą być scalane na ExampleElement obiektów.
W tym przykładzie należy wybrać ExampleElements, dzięki czemu użytkownik może przeciągać nowych elementów na istniejących elementów.
Należy zauważyć, że klasa indeksowania staje się nazwa EMD w Eksploratorze DSL.
W obszarze procesu korespondencji seryjnej, tworząc łącza, dodać dwie ścieżki:
Jedna ścieżka łączy nowy element modelu nadrzędnego.Wyrażenie ścieżki, które trzeba wprowadzić przeglądał z istniejącego elementu do osadzania relacji do nadrzędnego modelu.Wreszcie określa rolę w nowe łącze zostanie przypisany nowy element.Ścieżka jest następująca:
ExampleModelHasElements.ExampleModel/!ExampleModel/.Elements
Inne ścieżki łącza nowy element do istniejącego elementu.Wyrażenie ścieżki określa relację odniesienia i rolę, do którego zostanie przypisany nowy element.Ta ścieżka jest następująca:
ExampleElementReferencesTargets.Sources
Narzędzie nawigacji ścieżki można użyć do tworzenia każdej ścieżki:
W obszarze procesu korespondencji seryjnej, tworząc łącza na ścieżki, kliknij przycisk < Dodaj ścieżkę >.
Kliknij strzałkę po prawej stronie elementu listy rozwijanej.Zostanie wyświetlony widok drzewa.
Rozwiń węzły w strukturze drzewa określającej ścieżki, który chcesz określić.
Przetestować modem DSL:
Naciśnij klawisz F5, aby odbudować i uruchomić roztworu.
Odbudowa będzie trwało dłużej niż zwykle, ponieważ wygenerowany kod będzie aktualizowany na podstawie tekstu szablonów są zgodne z nową definicję DSL.
Gdy wystąpienie doświadczalnych Visual Studio ma uruchomiony, otwórz plik modelu, z linii DSL.Utwórz niektóre elementy przykład.
Przeciągnij z Przykładzie Element narzędzie do istniejącego kształtu.
Nowy kształt pojawi się i jest on połączony istniejącego kształtu za pomocą łącznika.
Kopiowanie istniejącego kształtu.Wybierz inny kształt i Wklej.
Tworzona jest kopia pierwszego kształtu.Ma ona nową nazwę i jest połączony z łącznika drugiego kształtu.
Należy zauważyć, następujące punkty z tej procedury:
Tworząc dyrektyw scalić elementu, można zezwolić na dowolnej klasy element do akceptowania żadnej innej.EMD jest tworzony w klasie otrzymującego domeny i klasa akceptowanych domen jest określona w indeksu klasy pola.
Definiując ścieżki, można określić, jakie łącza powinna być używana do łączenia nowy element z istniejącego modelu.
Łącza, które określisz powinny obejmować jedną relację osadzania.
EMD dotyczy zarówno tworzenie z przybornika, a także operacje wklejania.
Jeśli piszesz niestandardowy kod, który tworzy nowe elementy EMD jawnie można wywołać za pomocą ElementOperations.Merge metody.Dzięki kodu łączy nowe elementy do modelu w taki sam sposób, jak inne operacje.Aby uzyskać więcej informacji, zobacz Dostosowywanie zachowania dotyczącego kopiowania.
Przykład: Dodawanie zaakceptować niestandardowy kod do EMD
Dodając kod niestandardowy do EMD, można zdefiniować bardziej złożonych zachowanie podczas scalania.Ten prosty przykład uniemożliwia użytkownikowi dodanie więcej niż stała liczba elementów do diagramu.Przykład modyfikuje domyślne EMD, który towarzyszy osadzania relacji.
Aby napisać kod niestandardowy zaakceptować ograniczenia, co użytkownik może dodawać
Tworzenie DSL za pomocą Minimalne języka roztwór szablonu.Otwórz diagram definicji DSL.
W Eksploratorze DSL, rozwiń węzeł Domeny klas, ExampleModel, Dyrektyw scalić elementu.Wybierz dyrektywy korespondencji seryjnej element o nazwie ExampleElement.
EMD ten kontroluje, w jaki sposób użytkownik może utworzyć nowy ExampleElement obiektów w modelu, na przykład poprzez przeciąganie z przybornika.
W Szczegóły DSL okno select używa niestandardowych zaakceptować.
Odbuduj roztworu.Będzie to nieco dłużej niż zwykle, ponieważ wygenerowany kod zostanie zaktualizowany z modelu.
Błąd kompilacji będzie zgłoszone, podobnie jak: "Company.ElementMergeSample.ExampleElement nie zawiera definicji dla CanMergeExampleElement…"
Należy zaimplementować metodę CanMergeExampleElement.
Utwórz nowy plik kodu w Dsl projektu.Zamień zawartość poniższy kod i zmienić obszaru nazw do obszaru nazw w projekcie.
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; } } }
Ten prosty przykład ogranicza liczbę elementów, które mogą być scalone z nadrzędnego modelu.Warunki bardziej interesujące metoda może sprawdzać wszystkie właściwości i łącza z obiektem odbierającym.On także sprawdzić właściwości łączących elementy, które są przewożone w ElementGroupPrototype.Aby uzyskać więcej informacji o ElementGroupPrototypes, zobacz Dostosowywanie zachowania dotyczącego kopiowania.Aby uzyskać więcej informacji na temat pisania kodu, który czyta modelu, zobacz Nawigowanie i aktualizowanie modelu w kodzie programu.
Przetestować modem DSL:
Naciśnij klawisz F5, aby odbudować roztworu.Gdy wystąpienie doświadczalnych Visual Studio zostanie otwarty, otwórz instancję modem DSL.
Tworzenie nowych elementów na kilka sposobów:
Przeciągnij z Przykładzie Element narzędzie na diagram.
W Przykład Eksplorator modelu, kliknij prawym przyciskiem myszy węzeł główny, a następnie kliknij przycisk Dodaj nowy Element przykład.
Kopiowanie i wklejanie elementu na diagramie.
Sprawdź, że nie można użyć dowolnego z następujących sposobów, aby dodać więcej niż cztery elementy w modelu.Jest tak, ponieważ używają one wszystkie dyrektywy scalić elementu.
Przykład: Dodawanie scalić niestandardowy kod do EMD
W korespondencji seryjnej niestandardowy kod można zdefiniować, co się dzieje, gdy użytkownik przeciąga się narzędziem lub wkleja na element.Aby zdefiniować niestandardowy korespondencji seryjnej na dwa sposoby:
Ustaw Używa scalić niestandardowe i kodu wymaganych dostaw.Kod zastępuje kod wygenerowany korespondencji seryjnej.Opcja ta jest używana, jeśli chcesz całkowicie zmienić definicję korespondencji seryjnej jest.
Zastąpić MergeRelate metodę, a opcjonalnie MergeDisconnect metody.Aby to zrobić, należy ustawić Generuje podwójne uzyskane właściwości klasy domeny.Kod może wywoływać kod wygenerowany korespondencji seryjnej w klasie podstawowej.Opcja ta jest używana, jeśli chcesz wykonać dodatkowe czynności po wykonał korespondencji seryjnej.
Oba podejścia dotyczą tylko scala, które są wykonywane przy użyciu tego EMD.Jeśli chcesz wpływają na wszystkie sposoby, w których można utworzyć element scalonych alternatywą jest zdefiniowanie AddRule na relacji osadzania i DeleteRule w klasie scalonego domeny.Aby uzyskać więcej informacji, zobacz Reguły propagujące zmiany w modelu.
Aby zastąpić MergeRelate
Upewnij się, zdefiniowane EMD, do którego chcesz dodać kod w definicji DSL.Jeśli chcesz, można dodać ścieżki i zdefiniować niestandardowy kod zaakceptować, jak opisano w poprzedniej sekcji.
Na diagramie DslDefinition zaznacz otrzymującego klasy korespondencji seryjnej.Zazwyczaj jest klasa na końcu źródła osadzania relacji.
Na przykład w DSL generowane z roztworu minimalne języka, zaznacz ExampleModel.
W Właściwości okno, ustawić Generuje podwójne uzyskane do true.
Odbuduj roztworu.
Sprawdź zawartość Dsl\Generated Files\DomainClasses.cs.Wyszukiwanie metody o nazwie MergeRelate i sprawdzić ich zawartość.Ułatwi to pisać własne wersje.
W nowym pliku kodu zapisu częściowej klasy dla klasy odbierającym i zastąpić MergeRelate metody.Pamiętaj, aby wywołać metody podstawowej.Na przykład:
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(); } } }
Aby napisać kod niestandardowy scalania
W Dsl\Generated Code\DomainClasses.cs, inspekcji metody o nazwie MergeRelate.Metody te tworzyć łącza między nowy element i istniejącego modelu.
Ponadto inspekcji metody o nazwie MergeDisconnect.Metody te Odłączanie elementu z modelu po mają zostać usunięte.
W DSL Explorer, wybierz lub Utwórz dyrektywy scalanie elementów, które chcesz dostosować.W Szczegóły DSL okno, ustawić Używa scalić niestandardowe.
Po ustawieniu tej opcji, Proces scalania i Do przodu scalić opcje są ignorowane.Kod jest używany zamiast.
Odbuduj roztworu.Będzie trwało dłużej niż zwykle, ponieważ pliki wygenerowany kod zostanie zaktualizowany z modelu.
Pojawią się komunikaty o błędach.Kliknij dwukrotnie komunikaty o błędach, aby uzyskać instrukcje w generowanym kodzie.Instrukcje te może poprosić o dwie metody dostarczania MergeRelateYourDomainClass i MergeDisconnectYourDomainClass
Metod zapisu w definicji częściowej klasy w pliku osobnego kodu.Przykłady, które są kontrolowane w starszej powinny sugerują, co jest potrzebne.
Kod niestandardowy korespondencji seryjnej nie ma wpływu na kod, który tworzy obiekty i relacje bezpośrednio i nie ma wpływu na inne EMDs.Aby upewnić się, że dodatkowe zmiany są wykonywane niezależnie od tego, jaki element jest tworzony, należy wziąć pod uwagę piśmie AddRule i DeleteRule zamiast.Aby uzyskać więcej informacji, zobacz Reguły propagujące zmiany w modelu.
Przekierowywanie operacji scalania
Dyrektywy korespondencji seryjnej do przodu przekierowuje cel operacji scalania.Zazwyczaj nowy obiekt docelowy jest osadzania nadrzędnym początkowy cel.
Na przykład w DSL, który został utworzony za pomocą szablonu diagram składników, porty są osadzone w składniki.Porty są wyświetlane jako małe kształtów na krawędzi kształtu składnik.Użytkownik tworzy portów, przeciągając narzędzie portu na kształt składnik.Ale czasami użytkownik przez pomyłkę przeciągane narzędzie portu na istniejącego portu, zamiast części, i kończy się niepowodzeniem.Jest to łatwe pomyłka po kilka istniejących portów.Aby ułatwić użytkownikowi uniknięcia tej niedogodności, można zezwolić portów, aby zostać przeciągnięty na istniejącego portu, ale mają działanie Przekierowano do składnika nadrzędnego.Operacja działa jako element docelowy gdyby składnika.
Można utworzyć dyrektywy korespondencji seryjnej do przodu w roztworze składnika modelu.Jeśli skompilować i uruchomić oryginalnego roztworu, powinieneś zobaczyć, że użytkownicy będą mogli przeciągać dowolną liczbę Port wejścia lub Port wyjściowy elementy z Przybornik do składnika element.Jednakże one nie można przeciągać port do istniejącego portu.Wskaźnik niedostępne alerty, ich przeniesienie to nie jest włączony.Jednak utworzyć dyrektywy korespondencji seryjnej do przodu, tak że port jest przypadkowo został upuszczony na istniejącym Port wejścia jest przesyłany dalej do składnika element.
Aby utworzyć dyrektywy korespondencji seryjnej do przodu
Tworzenie Narzędzia językowe właściwe dla domeny roztwór za pomocą szablonu składnika modelu.
Wyświetl DSL Explorer przez otwarcie DslDefinition.dsl.
W DSL Explorer, rozwiń węzeł Domeny klas.
ComponentPort domeny abstrakcyjna klasa jest klasą bazową obu InPort i OutPort.Kliknij prawym przyciskiem myszy ComponentPort , a następnie kliknij przycisk Dodaj nowy Element scalić dyrektywy.
Nowy Dyrektywy scalić elementu węzeł pojawia się w obszarze Elementu scalania dyrektyw węzła.
Wybierz Dyrektywy scalić elementu węzeł i Otwórz Szczegóły DSL okna.
Zaznacz na liście indeksowania klasy ComponentPort.
Wybierz przekazania korespondencji seryjnej do innej domeny klasy.
Na liście wyboru ścieżki rozwiń ComponentPort, rozwiń węzeł ComponentHasPorts, a następnie wybierz składnika.
Nowa ścieżka powinno być podobne to:
ComponentHasPorts.Component/!Składnik
Zapisz roztworu, a następnie przekształć szablonów, klikając przycisk po prawej stronie na Solution Explorer paska narzędzi.
Tworzenie i uruchamianie roztworu.Nowe wystąpienie Visual Studio jest wyświetlany.
W Solution Explorer, otwórz Sample.mydsl.Diagram i Przybornik ComponentLanguage są wyświetlane.
Przeciągnij Port wejścia z Przybornik do innego Portu danych wejściowych. Następnie przeciągnij OutputPort do InputPort i następnie do innego OutputPort.
Nie zobaczysz wskaźnik niedostępne i powinny być w stanie upuścić nowe Port wejścia na istniejącym.Wybierz nowy Port wejścia i przeciągnij go do innego punktu na składnika.
Zobacz też
Koncepcje
Nawigowanie i aktualizowanie modelu w kodzie programu
Dostosowywanie narzędzi i przybornika