Udostępnij za pośrednictwem


Aktualizowanie kształtów i łączników, aby odzwierciedlały model

W języku specyficzne dla domeny, w Visual Studio, można wprowadzać wyglądu kształtu, które odzwierciedlają stan modelu źródłowego.

Przykłady kodu w tym temacie powinny zostać dodane do .cs plików w sieci Dsl projektu.Instrukcje te w każdym pliku będą potrzebne:

using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;

Ustawianie właściwości kształtu mapy do sterowania widocznością dekorator

Można sterować widocznością dekorator, bez potrzeby pisania kodu programu, konfigurując mapowania między kształtem a klasa domeny w definicji DSL.Aby uzyskać więcej informacji zobacz następujące tematy:

Narazić koloru i stylu kształtu jako właściwości

W definicji DSL, kliknij prawym przyciskiem myszy klasę shape, wskaż polecenie Dodać narażonych, a następnie kliknij jeden z elementów takich jak Kolor wypełnienia.

Kształt ma teraz właściwości domeny, który można ustawić w kod programu lub jako użytkownik.Na przykład aby ustawić kod programu polecenia lub regułę, można napisać:

shape.FillColor = System.Drawing.Color.Red;

Jeśli chcesz zmienna właściwość jedynie pod kontrolą program, a nie przez użytkownika, wybierz nowe właściwości domeny takich jak Kolor wypełnienia na diagramie definicji DSL.Następnie w oknie dialogowym właściwości ustaw Jest przeglądana do false lub Jest tylko do odczytu w interfejsie użytkownika do true.

Definiowanie reguł zmiany koloru, stylu lub lokalizacji zależą od właściwości elementu modelu

Można zdefiniować zasady, które aktualizują wygląd kształtu zależne od innych części modelu.Na przykład można zdefiniować Zmień regułę elementu modelu, który aktualizuje kolor jego kształt, które są zależne od właściwości elementu modelu.Aby uzyskać więcej informacji dotyczących zmiany reguł, zobacz Reguły propagujące zmiany w modelu.

Zasady należy używać tylko po to, aby zaktualizować właściwości, które są utrzymywane w magazynie, ponieważ zasady nie są wywoływane, gdy wykonywane jest polecenie Cofnij.Nie dotyczy to niektóre funkcje graficzne, takie jak rozmiar i widoczność kształtu.Aby zaktualizować te funkcje kształtu, zobacz funkcji graficznych magazynu bez aktualizowania.

W poniższym przykładzie założono, że zostały narażone FillColor jako właściwości domeny, jak opisano w poprzedniej sekcji.

[RuleOn(typeof(ExampleElement))]
  class ExampleElementPropertyRule : ChangeRule
  {
    public override void ElementPropertyChanged(ElementPropertyChangedEventArgs e)
    {
      base.ElementPropertyChanged(e);
      ExampleElement element = e.ModelElement as ExampleElement;
      // The rule is called for every property that is updated.
      // Therefore, verify which property changed:
      if (e.DomainProperty.Id == ExampleElement.NameDomainPropertyId)
      {
        // There is usually only one shape:
        foreach (PresentationElement pel in PresentationViewsSubject.GetPresentation(element))
        {
          ExampleShape shape = pel as ExampleShape;
          // Replace this with a useful condition:
          shape.FillColor = element.Name.EndsWith("3") 
                     ? System.Drawing.Color.Red : System.Drawing.Color.Green;
        }
      }
    }
  }
  // The rule must be registered:
  public partial class OnAssociatedPropertyExptDomainModel
  {
    protected override Type[] GetCustomDomainModelTypes()
    {
      List<Type> types = new List<Type>(base.GetCustomDomainModelTypes());
      types.Add(typeof(ExampleElementPropertyRule));
      // If you add more rules, list them here. 
      return types.ToArray();
    }
  }

Aby zainicjować właściwości kształtu, należy użyć OnChildConfigured

Aby ustawić właściwości kształtu przy pierwszym utworzone, zastąpienia OnChildConfigured() w definicji częściowej klasy diagramu.Klasa diagram jest określona w Państwa definicji DSL i wygenerowany kod znajduje się w Dsl\Generated Code\Diagram.cs.Na przykład:

  partial class MyLanguageDiagram
  {
    protected override void OnChildConfigured(ShapeElement child, bool childWasPlaced, bool createdDuringViewFixup)
    {
      base.OnChildConfigured(child, childWasPlaced, createdDuringViewFixup);
      ExampleShape shape = child as ExampleShape;
      if (shape != null) 
      {
        if (!createdDuringViewFixup) return; // Ignore load from file.
        ExampleElement element = shape.ModelElement as ExampleElement;
        // Replace with a useful condition:
        shape.FillColor = element.Name.EndsWith("3") 
            ? System.Drawing.Color.Red : System.Drawing.Color.Green;
      }
      // else deal with other types of shapes and connectors.
    }
  }

Ta metoda może służyć zarówno dla właściwości domeny i funkcje-store, takie jak rozmiar kształtu.

Zaktualizować inne funkcje kształtu za pomocą AssociateValueWith()

W przypadku niektórych funkcji kształtu, takich jak na to, czy ma cień lub Styl strzałki łącznika istnieje wbudowanej metody ujawnienia funkcji jako właściwości domeny.Zmiany takie funkcje nie są pod kontrolą systemu transakcji.W związku z tym, nie jest właściwe, aby aktualizować je przy użyciu reguł, ponieważ zasady nie są wywoływane, gdy użytkownik wykonuje polecenia Cofnij.

Zamiast tego można zaktualizować takich funkcji, za pomocą OnAssociatedPropertyChanged.W poniższym przykładzie Styl strzałki łącznika jest kontrolowana przez wartość właściwości domeny w relacji, który wyświetla łącznika:

public partial class ArrowConnector // My connector class. 
{
   /// <summary>
    /// Called whenever a registered property changes in the associated model element.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnAssociatedPropertyChanged(VisualStudio.Modeling.Diagrams.PropertyChangedEventArgs e)
    {
      base.OnAssociatedPropertyChanged(e);
      // Can be called for any property change. Therefore,
      // Verify that this is the property we're interested in:
      if ("IsDirected".Equals(e.PropertyName))
      {
        if (e.NewValue.Equals(true))
        { // Update the shape’s built-in Decorator feature:
          this.DecoratorTo = LinkDecorator.DecoratorEmptyArrow;
        }
        else
        {
          this.DecoratorTo = null; // No arrowhead.
        }
      }
    }
    // OnAssociatedPropertyChanged is called only for properties
    // that have been registered using AssociateValueWith().
    // InitializeResources is a convenient place to call this.
    // This method is invoked only once per class, even though
    // it is an instance method. 
    protected override void InitializeResources(StyleSet classStyleSet)
    {
      base.InitializeResources(classStyleSet);
      AssociateValueWith(this.Store, Wire.IsDirectedDomainPropertyId);
      // Add other properties here.
    }
} 

AssociateValueWith()należy wywołać jeden raz dla każdej właściwości domeny, który chcesz zarejestrować.Po została wywołana, wszelkie zmiany do określonej właściwości będzie wywoływać OnAssociatedPropertyChanged() w żadnych kształtów, które są dostępne właściwości elementu modelu.

Nie jest potrzebny do wywołania AssociateValueWith() dla każdego wystąpienia.Chociaż InitializeResources jest metodą instancji, go jest wywoływana tylko jeden raz dla każdej klasy shape.