Partager via


Mise à jour des formes et des connecteurs pour refléter le modèle

Dans un langage spécifique au domaine dans Visual Studio, vous pouvez effectuer l'apparence d'une forme refléter l'état du modèle sous-jacent.

Les exemples de code de cette rubrique doivent être ajoutés à un fichier d' .cs dans votre projet d' Dsl . vous aurez besoin de ces instructions dans chaque fichier :

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

Propriétés de carte de forme pour contrôler la visibilité d'un élément décoratif

Vous pouvez contrôler la visibilité d'un élément décoratif sans écrire le code du programme, en configurant le mappage entre la forme et la classe de domaine dans la définition de langage spécifique à un domaine. Pour plus d'informations, consultez les rubriques suivantes :

Exposez le style et la couleur d'une forme en tant que propriétés

Dans la définition DÉSOLÉ, cliquez avec le bouton droit sur la classe de forme, pointez sur ajoutez exposé, puis cliquez sur l'un des éléments tels que couleur de remplissage.

La forme a maintenant une propriété de domaine que vous pouvez définir dans le code du programme ou utilisateur. Par exemple, pour le définir dans le code de programme d'une commande ou d'une règle, vous pouvez écrire :

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

Si vous souhaitez que la variable de propriété que sous le contrôle du programme, et pas par l'utilisateur, sélectionnez la nouvelle propriété de domaine telle que couleur de remplissage dans le diagramme de définition de langage spécifique à un domaine. Ensuite, dans la fenêtre Propriétés, affectez Peut être exploré à false ou est l'interface utilisateur en lecture seule défini à true.

définissez les règles de modification de faire la couleur, style ou l'emplacement dépendent des propriétés d'élément de modèle

Vous pouvez définir des règles qui mettent à jour l'apparence du dépendant de formes sur d'autres parties du modèle. Par exemple, vous pouvez définir une règle de modification d'un élément de modèle qui met à jour la couleur de son dépendant de formes sur les propriétés de l'élément de modèle. Pour plus d'informations sur les règles de modification, consultez le Propagation de modifications dans le modèle par des règles.

Vous devez utiliser des règles de mettre à jour uniquement les propriétés qui sont conservées dans le magasin, car les règles ne sont pas appelées lorsque la commande annuler est effectuée. Cela n'inclut pas certaines fonctionnalités graphiques telles que la taille et la visibilité d'une forme. Pour mettre à jour ces fonctionnalités d'une forme, consultez mettre à jour les fonctionnalités graphiques de la Non-Banque.

L'exemple suivant suppose que vous avez exposé FillColor comme propriété de domaine comme décrit dans la section précédente.

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

Utilisez OnChildConfigured pour initialiser les propriétés d'une forme

Pour définir les propriétés d'une forme lors de le premier créée, la substitution OnChildConfigured() dans une définition partielle de la classe de votre diagramme. La classe de diagramme est spécifié dans votre définition DÉSOLÉ, et le code généré est dans Dsl\Generated Code\Diagram.cs. Par exemple :

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

Cette méthode peut être utilisée pour les propriétés de domaine et des fonctionnalités de la non-banque, telles que la taille de la forme.

Utilisez AssociateValueWith() pour mettre à jour d'autres fonctionnalités d'une forme

Pour certaines fonctionnalités d'une forme, si elle a une ombre, ou le style de flèche d'un connecteur, il n'y a aucune méthode intégrée pour exposer les fonctionnalités comme propriété de domaine. Les modifications apportées à ces fonctionnalités ne sont pas sous le contrôle du système de transaction. Par conséquent, il n'est pas approprié de mettre à jour à l'aide de règles, car les règles ne sont pas appelées lorsque l'utilisateur exécute la commande annuler.

À la place, vous pouvez mettre à jour de ces fonctionnalités à l'aide de l' OnAssociatedPropertyChanged. dans l'exemple suivant, le style de flèche d'un connecteur est contrôlé par une valeur d'une propriété de domaine dans la relation que le connecteur affiche :

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() doit être appelé une fois pour chaque propriété de domaine que vous souhaitez enregistrer. Après qu'il a été appelé, toutes les modifications apportées à la propriété spécifiée appellent OnAssociatedPropertyChanged() dans toutes les formes qui présentent l'élément de modèle de la propriété.

il n'est pas nécessaire d'appeler AssociateValueWith() pour chaque instance. Bien qu'InitializeResources soit une méthode d'instance, il est appelé qu'une seule fois pour chaque classe de forme.