Sdílet prostřednictvím


Aktualizace obrazců a konektorů k vyjádření modelu

Domény specifické pro jazyk v Visual Studio, můžete vytvořit vzhled tvaru odpovídat stavu podkladového modelu.

Příklady kódu v tomto tématu by mělo být do .cs v souboru vaše Dsl projektu.Tyto příkazy v každém souboru budete potřebovat:

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

Nastavit vlastnosti obrazce Map pro ovládání viditelnosti decorator

Bez psaní kódu programu, konfigurace mapování mezi obrazci a domény třídy v definici DSL můžete ovládat viditelnost decorator.Další informace naleznete v následujících tématech:

Vystavit barvu a styl tvaru jako vlastnosti

V definici DSL pravým tlačítkem myši na obrazec Třída, přejděte na Přidat vystavenia klepněte na položky jako například Barva výplně.

Obrazec má nyní vlastnost domény, lze nastavit v kódu programu nebo jako uživatel.Například chcete-li nastavit program kód příkazu nebo pravidlo, můžete napsat:

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

Pokud chcete, aby vlastnost proměnná pouze za řízení programu a není uživatelem, vyberte nové vlastnosti domény jako Barva výplně v diagramu definice DSL.Potom v okně Vlastnosti nastavte Je procházet na false nebo Readonly UI je na true.

Definovat pravidla změnit barvu, styl nebo umístění závisí na vlastnosti prvku modelu

Můžete definovat pravidla, které aktualizovat vzhled obrazce, které jsou závislé na jiných částech modelu.Můžete například definovat změnit pravidlo na prvek modelu, který aktualizuje barvu jeho tvar závislé na vlastnosti prvku modelu.Další informace o změně pravidel naleznete v Pravidla šířící změny v modelu.

Pravidla používejte pouze k aktualizaci vlastnosti, které jsou udržovány v úložišti, protože pravidla není vyvolána při provedení příkazu Zpět.To nezahrnuje některé grafické funkce, jako je například velikost a tvar viditelnost.Aktualizovat obrazce těchto funkcí naleznete v tématu aktualizace úložiště bez grafické funkce.

Následující příklad předpokládá, že jste vystaveni FillColor jako vlastnost domain popsaným v předchozí části.

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

Inicializace vlastnosti obrazce pomocí OnChildConfigured

Nastavení vlastností obrazce při prvním vytvoření vyřazení OnChildConfigured() v částečnou definici třídy v diagramu.Diagram třídy je zadána v DSL Definition a generovaný kód je v Dsl\Generated Code\Diagram.cs.Příklad:

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

Tuto metodu lze použít pro vlastnosti domény i bez úložiště funkce, jako je například velikost obrazce.

Aktualizovat obrazce další funkce pomocí AssociateValueWith()

Některé funkce tvaru, například zda má stín nebo Šipka styl spojnice je žádná metoda vestavěné funkce jako vlastnost domain úniku.Změny těchto funkcí nejsou pod kontrolou systému transakcí.Proto není vhodné je aktualizovat pomocí pravidel, protože pravidla není vyvolána, když uživatel provede příkaz zpět.

Místo toho můžete aktualizovat funkcí, například pomocí OnAssociatedPropertyChanged.Šipka styl spojnice ovládá hodnotu vlastnosti domény ve vztahu, který zobrazuje spojnice v následujícím příkladu:

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()by měla být volána jednou pro každou vlastnost domény, který chcete zaregistrovat.Poté, co byla volána, bude volat změny určenou vlastnost OnAssociatedPropertyChanged() ve všech obrazců, které představují vlastnosti prvku modelu.

Není nutné volat AssociateValueWith() pro každou instanci.Metody instance sice InitializeResources vyvolána pouze jednou pro každou třídu obrazce.