Freigeben über


Aktualisieren von Formen und Konnektoren zur Darstellung des Modells

In einer domänenspezifischen Sprache in Visual Studio, können Sie die Darstellung von einem Formular den Zustand des zugrunde liegenden Modell widerspiegeln lassen.

Die Codebeispiele in diesem Thema sollten mit einer .cs Datei im Dsl Projekt hinzugefügt werden.Sie benötigen diese Anweisungen in jeder Datei:

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

Form-Karten Festlegen von Eigenschaften, um die Sichtbarkeit eines Decorator-Elements zu steuern

Sie können die Sichtbarkeit eines Decorator-Elements steuern, ohne Programmcode schreiben, indem Sie die Zuordnung zwischen dem Formular und Domänenklasse in der DSL-Definition konfigurieren.Weitere Informationen finden Sie unter den folgenden Themen:

Machen Sie die Farbe und den Stil einer Form als Eigenschaften

In der DSL-Definition mit der rechten Maustaste auf die Form Klasse, zeigen Sie auf Verfügbar gemacht hinzufügen, und klicken Sie dann auf eines der Elemente wie Füllfarbe.

Die Form verfügt jetzt über eine Domäneneigenschaft, die Sie im Programmcode oder als Benutzer festlegen können.Um beispielsweise sie im Programmcode eines Befehls oder der Regel festzulegen, können Sie schreiben:

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

Wenn Sie die Eigenschaft die Variable nur unter Programm die Steuerung und nicht vom Benutzer ausführen möchten, wählen Sie die neue Domäneneigenschaft wie Füllfarbe DSL-Definitions im Diagramm aus.Anschließend legen Sie im Eigenschaftenfenster auf Ist durchsuchbar festlegen oder falsetruezu Ist schreibgeschützte Benutzeroberfläche fest.

Definieren Sie Änderungs-Regeln, Farbe, Format oder Speicherort zu erleichtern, sind von den Eigenschaften des Modellelements ab

Sie können Regeln definieren, die die Darstellung der Form abhängige Element in anderen Teilen des Modells aktualisieren.Beispielsweise können Sie eine Änderungs-Regel für ein Modellelement definieren, die die Farbe der Form abhängigen Elements für die Eigenschaften des Modellelements aktualisiert.Weitere Informationen zu Änderungs-Regeln finden Sie unter Regeln propagieren Änderungen im Modell.

Sie können Regeln Eigenschaften können nur zu aktualisieren, die im Speicher beibehalten werden, da Regeln nicht aufgerufen werden, wenn der Befehl Rückgängig ausgeführt wird.Dies schließt nicht mehrere grafische Features wie die Größe und die Sichtbarkeit einer Form ein.Um diese Funktionen einer Form zu aktualisieren, finden Sie unter Nicht-Speicher grafische Features aktualisieren.

Im folgenden Beispiel wird davon ausgegangen, dass Sie FillColor als Domäneneigenschaft bereitgestellt haben, wie im vorherigen Abschnitt beschrieben.

[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();
    }
  }

Verwendung OnChildConfigured Eigenschaften, die zum Initialisieren einer Form

So zeigen Sie die Eigenschaften einer Form festlegen, wenn sie zum ersten Mal erstellt wird, die Überschreibung OnChildConfigured() in einer partiellen Definition der Diagramm Klasse.Das Diagramm wird in der DSL-Definition Klasse angegeben. Der generierte Code wird in Dsl\Generated Code\Diagram.cs.Beispiele:

  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.
    }
  }

Diese Methode kann für Domäneneigenschaften und Nicht Speicher Funktionen, z. B. die Größe der Form verwendet werden.

Verwenden Sie AssociateValueWith(), um weitere Funktionen zum Aktualisieren einer Form

Für einige Features einer Form, z. B. ob sie einen Schatten aufweist oder das Format des Pfeils eines Konnektors, gibt es keine integrierte Möglichkeit zum Verfügbarmachen der Funktion als Domäneneigenschaft.Änderungen an diesen Funktionen sind keine Kontrolle des Buchungssystems.Daher ist es nicht sinnvoll, mithilfe der Regeln zu aktualisieren, da Regeln nicht aufgerufen werden, wenn der Benutzer den Befehl Rückgängig.

Stattdessen können Sie solche Funktionen aktualisieren, indem Sie OnAssociatedPropertyChangedverwenden.Im folgenden Beispiel wird das Format des Pfeils eines Konnektors durch den Wert einer Domäneneigenschaft relativ gesteuert, das der Konnektor angezeigt wird:

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() sollte aufgerufen werden einmal für jede Domäneneigenschaft, dass Sie registrieren möchten.Nachdem er aufgerufen wurde, erhalten alle Änderungen an der angegebenen Eigenschaft OnAssociatedPropertyChanged() in einem Forms an, die das Modellelement der Eigenschaft darstellt.

Es ist nicht erforderlich, AssociateValueWith() für jede Instanz aufzurufen.Obwohl InitializeResources eine Instanzmethode handelt, wird es nur einmal für jede Form Klasse aufgerufen.