Dostosowywanie narzędzi i przybornika
Zdefiniuj elementy przybornika dla elementów, które chcesz zezwolić użytkownikom na wprowadzanie na ich modeli.Dostępne są dwa rodzaje narzędzia: element narzędzia i połączenia.W Projektancie wygenerowanego użytkownika narzędzie elementu przeciągnij kształty do diagramu można wybrać i można wybrać narzędzie do rysowania łącza między kształtami połączenia.Ogólnie rzecz biorąc narzędzia elementu zezwala użytkownikom na dodawanie wystąpienia klas domeny do ich modeli i narzędzia połączenia zdalne je dodać wystąpienia relacji domeny.
W tym temacie:
Sposób definiowania jest przybornika
Narzędzia dostosowywania elementów
Tworzenie grup elementów za pomocą narzędzia
Dostosowywanie narzędzia połączeń
Sposób definiowania jest przybornika
W Eksploratorze DSL rozwiń węzeł edytora i węzłów podrzędnych.Zwykle pojawią się hierarchii podobny to:
Editor
Toobox Tabs
MyDsl //a tab
Tools
ExampleElement // an element tool
ExampleRelationship // a connection tool
W tej części Eksploratora DSL należy wykonać następujące czynności:
Utwórz nowe karty.Karty do definiowania nagłówki sekcji przybornika.
Utwórz nowe narzędzia.
Skopiuj i Wklej narzędzia.
Przenieś narzędzia w górę lub w dół na liście.
Usuwanie karty i narzędzi.
Ważne |
---|
Aby dodać lub Wklej elementy w Eksploratorze DSL, kliknij prawym przyciskiem myszy nadrzędny nowego węzła.Na przykład, aby dodać narzędzie, kliknij prawym przyciskiem myszy kartę, a nie narzędzia węzła.Aby dodać kartę, kliknij prawym przyciskiem myszy edytora węzła. |
Ikonę przybornika właściwości każdego narzędzia odwołuje się do pliku mapy bitowej 16 x 16.Te pliki zazwyczaj są przechowywane w Dsl\Resources folder.
Klasy właściwości elementu narzędzia odwołuje się do klasy konkretne domeny.Domyślnie to narzędzie spowoduje utworzenie wystąpienia tej klasy.Jednak można wpisać kod zawiera narzędzie do tworzenia grup elementów lub elementy różnych typów.
Połączenia konstruktora właściwości narzędzia połączenia odwołuje się do konstruktora połączenia, który definiuje typy elementów tego narzędzia można połączyć i jakie relacje tworzy między nimi.Konstruktorów połączenia są definiowane jako węzły w Eksploratorze DSL.Konstruktorów połączenia są tworzone automatycznie podczas definiowania relacji domeny, ale można wpisać kod, aby dostosować je.
Aby dodać narzędzie do przybornika
Po utworzeniu klasy shape i jego mapowane na klasy domeny zwykle utworzyć narzędzie elementu.
Po utworzeniu łącznika klasę i zamapować go do relacji zwykle utworzyć narzędzia łącznika.
W Eksploratorze DSL rozwiń edytora węzła i karty przybornika węzła.
Kliknij prawym przyciskiem myszy węzeł karta przybornika, a następnie kliknij przycisk Dodaj nowe narzędzie elementu lub Dodaj nowe narzędzie połączenia.
Ustaw ikonę przybornika właściwości w celu odwoływania się do mapy bitowej 16 x 16.
Jeśli chcesz zdefiniować nową ikonę, Utwórz plik mapy bitowej w Eksploratorze rozwiązań w Dsl\Resources folder.Plik powinien mieć następujące wartości właściwości: tworzenie akcji = zawartości; Kopiuj do katalogu wyjściowego = nie Kopiuj.
Dla narzędzia elementu: ustawić klasy właściwości narzędzia do odwoływania się do klasy konkretne domeny, która jest zamapowana na kształt.
Narzędzia łącznika: ustawić połączenia konstruktora właściwości narzędzia do jednego z elementów, które są oferowane na liście rozwijanej.Konstruktorów połączenia są tworzone automatycznie podczas mapowania łącznika do relacji domeny.Jeśli niedawno został utworzony łącznik, zazwyczaj wybierany konstruktora skojarzona z połączeniem.
Aby przetestować DSL, naciśnij klawisz F5 lub CTRL + F5 i w wystąpieniu doświadczalnych Visual Studio, otwórz plik przykładowy modelu.Nowe narzędzie mają pojawiać się na przybornika.Przeciągnij je na diagramu należy sprawdzić, czy tworzenia nowego elementu.
Jeśli nie ma tego narzędzia, Zatrzymaj doświadczalnych Visual Studio.W systemie Windows Start menu, uruchom zresetować wystąpienia doświadczalnych programu Microsoft Visual Studio 2010.On the Visual Studio Build menu, click Rebuild Solution.Następnie ponownie przetestować DSL.
Narzędzia dostosowywania elementów
Domyślnie to narzędzie utworzy pojedyncze wystąpienie określonej klasy, ale można zmieniać to na dwa sposoby:
Zdefiniuj Element Scal dyrektywy na innych klas, pozwalającego zaakceptować nowe wystąpienia tej klasy i włączyć je w celu utworzenia dodatkowych łączy podczas tworzenia nowego elementu.Można na przykład Zezwalaj użytkownikom na upuść komentarz do innego elementu, a tym samym utworzyć łącze odwołania między nimi.
Te modyfikacje również wpływać na, co się stanie, gdy użytkownik wklejony lub przeciąga i spada elementu.
Aby uzyskać więcej informacji, zobacz Dostosowywanie tworzenia i przesuwania elementów.
Pisać kod, aby dostosować narzędzie tak, aby móc tworzyć grupy elementów.Narzędzia została zainicjowana przy użyciu metod w ToolboxHelper.cs, który można zastąpić.Aby uzyskać więcej informacji, zobacz tworzenia grup z elementów za pomocą narzędzia.
Tworzenie grup elementów za pomocą narzędzia
Narzędzie każdy element zawiera prototypu elementów, które powinien zostać utworzony.Domyślnie narzędzie każdy element tworzy pojedynczy element, ale użytkownik może również do tworzenia grupy obiektów powiązanych z jednego narzędzia.W tym celu należy zainicjować narzędzia z ElementGroupPrototype zawiera elementy pokrewne.
Poniższy przykład pochodzi z DSL, w którym jest typem tranzystor.Każdy tranzystor ma trzy nazwanych terminali.Narzędzie elementu dla tranzystory przechowuje prototypu zawierający cztery elementy modelu i trzy łącza relacji.Gdy użytkownik przeciągnie narzędzie na diagram, prototyp jest wystąpienia i połączona z głównego modelu.
Ten kod zastępuje metodę, która jest zdefiniowana w Dsl\GeneratedCode\ToolboxHelper.cs.
Aby uzyskać więcej informacji dotyczących dostosowywania modelu przy użyciu kodu programu, zobacz Nawigowanie i aktualizowanie modelu w kodzie programu.
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
public partial class CircuitsToolboxHelper
{
/// <summary>
/// Toolbox initialization, called for each element tool on the toolbox.
/// This version deals with each Component subtype separately.
/// </summary>
/// <param name="store"></param>
/// <param name="domainClassId">Identifies the domain class this tool should instantiate.</param>
/// <returns>prototype of the object or group of objects to be created by tool</returns>
protected override ElementGroupPrototype CreateElementToolPrototype(Store store, Guid domainClassId)
{
if (domainClassId == Transistor.DomainClassId)
{
Transistor transistor = new Transistor(store);
transistor.Base = new ComponentTerminal(store);
transistor.Collector = new ComponentTerminal(store);
transistor.Emitter = new ComponentTerminal(store);
transistor.Base.Name = "base";
transistor.Collector.Name = "collector";
transistor.Emitter.Name = "emitter";
// Create an ElementGroup for the Toolbox.
ElementGroup elementGroup = new ElementGroup(store.DefaultPartition);
elementGroup.AddGraph(transistor, true);
// AddGraph includes the embedded parts
return elementGroup.CreatePrototype();
}
else
{
return base.CreateElementToolPrototype(store, domainClassId);
} } }
Dostosowywanie narzędzia połączeń
Zazwyczaj narzędzie elementu można utworzyć podczas tworzenia nowej klasy łącznika.Alternatywnie można przeciążać jedno narzędzie pozwalając typy punktów końcowych do określania typu relacji.Na przykład można zdefiniować jedno narzędzie połączenia, który można utworzyć zarówno relacje osoby osoby i relacje miasta osoby.
Narzędzia połączenia wywołania konstruktorów połączenia.Użyj konstruktorów połączenie, aby określić, jak użytkownicy można połączyć elementów w Projektancie wygenerowany.Połączenie konstruktorów określić elementy, które mogą być połączone i rodzaj łącze, które utworzono między nimi.
Konstruktor połączeń jest tworzony automatycznie po utworzeniu relacji między klasami domeny.Podczas mapowania narzędzie połączenia, można użyć tego konstruktora połączenia.Aby uzyskać więcej informacji dotyczących sposobu tworzenia narzędzia połączenia, zobacz Dostosowywanie narzędzi i przybornika.
Domyślny konstruktor połączenia można modyfikować pozwalający na zajmuje się szereg różnych typów źródłowej i docelowej oraz tworzenie różnych typów relacji.
Można także napisać kodu niestandardowego dla producentów połączenia do określenia klasy źródłowej i docelowej dla połączenia, określają rodzaj połączenia ma zostać wykonane i wykonywać inne czynności związane z tworzeniem połączenia.
Struktura konstruktorów połączenia
Połączenie konstruktorów zawierać jeden lub więcej łącze połączyć dyrektywy, które określają relacji domeny i elementy źródłowe i docelowe.Na przykład w szablonie rozwiązania przepływ zadań widać CommentReferencesSubjectsBuilder w DSL Explorer.Ten konstruktor połączeń zawiera jedno łącze połączyć dyrektywy o nazwie CommentReferencesSubjects, którego jest zamapowany na relacji domeny CommentReferencesSubjects.Połącz to łącze dyrektywa zawiera źródło dyrektywy roli, wskazujące Comment klasy domeny i cel dyrektywy roli, wskazujące FlowElement klasy domeny.
Za pomocą połączenia konstruktorów do ograniczania źródła i docelowy ról
Połączenia konstruktorów służy do ograniczania wystąpienie niektórych klas w roli źródłowej lub rolę docelową relacji danej domenie.Na przykład mogą przysługiwać użytkownikowi na klasę podstawową domeny, która ma relację domeny do innej domeny klasy, ale nie ma wszystkie klasy pochodne klasy podstawowej, aby ról w tej relacji.W rozwiązaniu przepływ zadań istnieją cztery klasy konkretne domeny (StartPoint punktu końcowego, MergeBranch i synchronizacji), które dziedziczą bezpośrednio z klasy abstrakcyjnej domeny FlowElement i dwie klasy konkretne domeny (zadanie i ObjectInState), które dziedziczą pośrednio.Istnieje również relacji odwołania przepływu pobierającej klasy domeny FlowElement zarówno w jego roli źródłowej i docelowej roli.Jednak wystąpienie klasy domeny punktu końcowego nie może być problem z wystąpieniem relacji przepływu, ani nie powinien być wystąpieniem klasy StartPoint docelowego wystąpienia relacji przepływu.Konstruktor połączeń FlowBuilder znajduje się łącze połączyć dyrektywy o nazwie przepływu, która określa, która domena klasy można odtwarzać roli źródłowej (zadanie, MergeBranch, StartPoint i synchronizacji), które można odtwarzać rolę docelową (MergeBranch punktu końcowego i synchronizacji).
Dyrektywy połączyć konstruktorów połączenia z wieloma łącza
Możesz dodać więcej niż jedno łącze nawiązać dyrektywy Konstruktor połączeń.Może to ułatwić ukryć niektóre złożonością modelu domeny od użytkowników i przechowywać przybornika zbyt uniknąć.Możesz dodać łącze wytyczne dotyczące kilka relacji z inną domenę nawiązać połączenia z konstruktorem jednego połączenia.Należy jednak połączyć relacji domeny podczas ich wykonywania tej samej funkcji.
W rozwiązaniu przepływ zadań narzędzie połączenia przepływu służy do rysowania wystąpień przepływu i relacje domeny przejścia przepływu obiektu.FlowBuilder połączenia konstruktora oprócz łącze przepływu połączyć dyrektywy opisane wcześniej, łączy dwa łączyć dyrektywy o nazwie przejścia przepływu obiektu.Dyrektywy te Określ, czy wystąpienie relacji przejścia przepływu obiektu może być rysowany między wystąpieniami klasy ObjectInState domeny, lub z wystąpienia ObjectInState na wystąpienie zadania, ale nie między dwa wystąpienia zadania lub wystąpienie zadania na wystąpienie klasy ObjectInState.Jednak wystąpienie relacji przepływu może być rysowany między dwa wystąpienia zadania.Jeśli kompilacja i uruchomić zadanie przepływu rozwiązań, możesz zobaczyć rysowania strumień z wystąpienia programu ObjectInState do wystąpienia zadania tworzy wystąpienie elementu docelowego przejścia przepływu, że rysowania przepływu między dwoma wystąpieniami zadanie tworzy wystąpienie przepływu.
Niestandardowy kod dla konstruktorów połączenia
Istnieją cztery pola wyboru w interfejsie użytkownika, definiujące różnego rodzaju dostosowania konstruktorów połączenia:
zaakceptować niestandardowe pole wyboru na źródłowa lub docelowa dyrektywy roli
niestandardowe połączenia pole wyboru na źródłowa lub docelowa dyrektywy roli
używa niestandardowego connect pole wyboru na dyrektywą witryny connect
jest niestandardowa właściwości konstruktora połączenia
Musisz podać kod program wykonać te dostosowania.Do wykrywania kodu, jakie należy podać, zaznacz przynajmniej jedną z tych pól, kliknij Transform wszystkie szablony, a następnie tworzyć rozwiązania.Raport o błędach spowoduje.Kliknij dwukrotnie raport błędów, aby zobaczyć komentarz, który wyjaśnia, jakie kodu, należy dodać.
[!UWAGA]
Aby dodać kodu niestandardowego, Utwórz definicję klasy częściowego w pliku kodu w plikach kodu w folderach GeneratedCode.Aby uniknąć utraty pracę, nie należy edytować pliki wygenerowanego kodu.Aby uzyskać więcej informacji, zobacz Zastępowanie i rozszerzanie wygenerowanych klas.
Tworzenie kodu niestandardowego połączenia
W każdej łącze połączyć dyrektywy, źródła dyrektywy roli kartę definiuje z co typów przeciągnąć.Na tej samej zasadzie celem dyrektywy roli definiuje kartę przeciągnąć co typów.Dla każdego typu, możesz podać, czy zezwalać na połączenie (dla tego łącza połączenia dyrektywy) przez ustawienie zaakceptować niestandardowe Flaga i następnie dostarczenie dodatkowego kodu.
Można również dostosować występuje, gdy zostanie nawiązane połączenie.Na przykład można dostosować tylko przypadkiem wykrycie przeciąganie z określonej klasy, lub połączyć łącze jeden wszystkich przypadkach dyrektywa reguluje, lub całej konstruktora FlowBuilder połączenia.Dla każdej z tych opcji można ustawić flagi niestandardowe na właściwym poziomie.Gdy przekształcenia wszystkie szablony i spróbuj tworzyć rozwiązania, komunikaty o błędach wskazówką do komentarze, które znajdują się w wygenerowanego kodu.Komentarze zidentyfikować, należy podać.
W próbce diagramu składników konstruktora połączenia dla połączenia relacji domeny jest dostosowane do ograniczania połączeń, które mogą być wprowadzone między portami.Poniższa ilustracja pokazuje, że połączenia można tworzyć tylko z OutPort elementy, aby InPort elementów, ale można zagnieździć składniki w sobie nawzajem.
Połączeń przychodzących na OutPort ze składnika zagnieżdżone
W związku z tym należy określić, czy połączenie mogą pochodzić z zagnieżdżonych składnik do OutPort.Aby określić takie połączenie, ustaw używa zaakceptować niestandardowe na InPort typu rolę źródła i OutPort typu rolę docelowego w szczegóły DSL okna, jak pokazano na poniższej ilustracji:
Łącze połączyć dyrektywy w Eksploratorze DSL
Łącze połączyć dyrektywy w oknie Szczegóły DSL
Następnie należy podać metod w klasie ConnectionBuilder:
public partial class ConnectionBuilder
{
/// <summary>
/// OK if this component has children
/// </summary>
private static bool CanAcceptInPortAsSource(InPort candidate)
{
return candidate.Component.Children.Count > 0;
}
/// <summary>
/// Only if source is on parent of target.
/// </summary>
private static bool CanAcceptInPortAndInPortAsSourceAndTarget (InPort sourceInPort, InPort targetInPort)
{
return sourceInPort.Component == targetInPort.Component.Parent;
}
// And similar for OutPorts…
Aby uzyskać więcej informacji dotyczących dostosowywania modelu przy użyciu kodu programu, zobacz Nawigowanie i aktualizowanie modelu w kodzie programu.
Podobne kodu, można użyć na przykład, aby uniemożliwić użytkownikom tworzenie pętli z łączami nadrzędny podrzędny.Te ograniczenia są uważane za ograniczenia "twardym", ponieważ użytkownik nie może ich naruszy w dowolnym momencie.Można również utworzyć sprawdzanie poprawności "miękkiego", które użytkownicy mogą tymczasowo obejść przy tworzeniu nieprawidłowy konfiguracji, które nie można zapisać.
Dobre praktyki definiując konstruktorów połączenia
Należy zdefiniować co konstruktora połączenia do tworzenia różnych typów relacji tylko wtedy, gdy są one pokrewne.W przykładzie przepływu zadań tym samym Konstruktora służy do tworzenia przepływów między zadania, a także między obiekty i zadania.Jednakże może być skomplikowane, można utworzyć relacji między komentarze i zadań za pomocą tej samej konstruktora.
Po zdefiniowaniu konstruktora połączeń dla wielu typów relacji, należy upewnić się, że nie może ona dopasowana więcej niż jeden typ z tej samej pary obiektów źródłowym i docelowym.W przeciwnym razie będzie nieprzewidywalnego wyników.
Zastosowany ograniczenia "twardym" za pomocą kodu niestandardowego, ale rozważ, czy użytkownicy powinni mieć możliwość tymczasowo nieprawidłowy połączenia.Jeśli te powinny można modyfikować ograniczenia, tak, aby nie poprawności połączeń aż do użytkowników, spróbuj zapisać zmiany.
Zobacz też
Koncepcje
Dostosowywanie tworzenia i przesuwania elementów
Dostosowywanie zachowania dotyczącego kopiowania
Porady: dodawanie obsługi przeciągania i upuszczania
Nawigowanie i aktualizowanie modelu w kodzie programu