Navigation et mise à jour d'un modèle dans le code de programmeNavigating and Updating a Model in Program Code

Vous pouvez écrire du code pour créer et supprimer des éléments de modèle, définir leurs propriétés, créer et supprimer les liens entre des éléments.You can write code to create and delete model elements, set their properties, and create and delete links between elements. Toutes les modifications doivent être effectuées dans une transaction.All changes must be made within a transaction. Si les éléments peuvent être affichés sur un diagramme, le diagramme doit être « corrigé « automatiquement à la fin de la transaction.If the elements are viewed on a diagram, the diagram will be "fixed up" automatically at the end of the transaction.

Dans cette rubriqueIn this Topic

Un exemple de définition DSLAn Example DSL Definition

Navigation dans le modèleNavigating the Model

L’accès aux informations de classeAccessing Class Information

Effectuer des modifications à l’intérieur d’une TransactionPerform Changes inside a Transaction

Création d’éléments de modèleCreating Model Elements

Création de liens de relationCreating Relationship Links

Suppression d’élémentsDeleting Elements

Suppression de liens de relationDeleting Relationship Links

Réorganiser les liens d’une relationReordering the Links of a Relationship

VerrousLocks

Copier et collerCopy and Paste

Navigation et la mise à jour des diagrammesNavigating and Updating Diagrams

Navigation entre les formes et des élémentsNavigating between Shapes and Elements

Propriétés des formes et des connecteursProperties of Shapes and Connectors

DocView et DocDataDocView and DocData

Un exemple de définition DSLAn Example DSL Definition

Il s’agit de la partie principale de DslDefinition.dsl pour les exemples de cette rubrique :This is the main part of DslDefinition.dsl for the examples in this topic:

Diagramme de définition DSL - modèle d’arbre généalogiqueDSL Definition diagram - family tree model

Ce modèle est une instance de cette DSL :This model is an instance of this DSL:

Modèle d’arbre généalogique TudorTudor Family Tree Model

Références et les espaces de nomsReferences and Namespaces

Pour exécuter le code dans cette rubrique, vous devez référencer :To run the code in this topic, you should reference:

Microsoft.VisualStudio.Modeling.Sdk.11.0.dll

Votre code utilise cet espace de noms :Your code will use this namespace:

using Microsoft.VisualStudio.Modeling;

En outre, si vous écrivez le code dans un projet différent de celui dans lequel votre DSL est défini, vous devez importer l’assembly qui est généré par le projet de Dsl.In addition, if you are writing the code in a different project from the one in which your DSL is defined, you should import the assembly that is built by the Dsl project.

PropriétésProperties

Propriétés du domaine que vous définissez dans la définition DSL deviennent les propriétés auxquelles vous pouvez accéder dans le code de programme :Domain properties that you define in the DSL definition become properties that you can access in program code:

Person henry = ...;

if (henry.BirthDate < 1500) ...

if (henry.Name.EndsWith("VIII")) ...

Si vous souhaitez définir une propriété, vous devez le faire à l’intérieur d’un transaction:If you want to set a property, you must do so inside a transaction:

henry.Name = "Henry VIII";

En cas de la définition DSL, une propriété type est calculé, vous ne pouvez pas la définir.If in the DSL definition, a property's Kind is Calculated, you cannot set it. Pour plus d’informations, consultez calculé et les propriétés de stockage personnalisé.For more information, see Calculated and Custom Storage Properties.

RelationsRelationships

Relations de domaine que vous définissez dans la définition DSL deviennent des paires de propriétés, l’autre sur la classe à chaque extrémité de la relation.Domain relationships that you define in the DSL definition become pairs of properties, one on the class at each end of the relationship. Les noms des propriétés s’affichent dans le diagramme de DslDefinition sous forme d’étiquettes sur les rôles au niveau de chaque côté de la relation.The names of the properties appear in the DslDefinition diagram as labels on the roles at each side of the relationship. En fonction de la multiplicité du rôle, le type de la propriété est la classe à l’autre extrémité de la relation, soit une collection de cette classe.Depending on the multiplicity of the role, the type of the property is either the class at the other end of the relationship, or a collection of that class.

foreach (Person child in henry.Children) { ... }

FamilyTreeModel ftree = henry.FamilyTreeModel;

Les propriétés à deux extrémités d’une relation sont toujours réciproque.The properties at opposite ends of a relationship are always reciprocal. Lorsqu’un lien est créé ou supprimé, les propriétés de rôle sur les deux éléments sont mis à jour.When a link is created or deleted, the role properties on both elements are updated. L’expression suivante (qui utilise les extensions de System.Linq) est toujours true pour la relation ParentsHaveChildren dans l’exemple :The following expression (which uses the extensions of System.Linq) is always true for the ParentsHaveChildren relationship in the example:

(Person p) => p.Children.All(child => child.Parents.Contains(p))

&& p.Parents.All(parent => parent.Children.Contains(p));

ElementLinks.ElementLinks. Une relation est également représentée par un élément de modèle appelé un lien, qui est une instance du type de relation de domaine.A relationship is also represented by a model element called a link, which is an instance of the domain relationship type. Un lien a toujours l’élément d’une source et l’élément d’une cible.A link always has one source element and one target element. L’élément source et l’élément cible peuvent être le même.The source element and the target element can be the same.

Vous pouvez accéder à un lien et ses propriétés :You can access a link and its properties:

ParentsHaveChildren link = ParentsHaveChildren.GetLink(henry, edward);

// This is now true:

link == null || link.Parent == henry && link.Child == edward

Par défaut, pas plus d’une instance d’une relation est autorisée à lier n’importe quelle paire d’éléments de modèle.By default, no more than one instance of a relationship is allowed to link any pair of model elements. Mais si, dans la définition DSL, le Allow Duplicates indicateur a la valeur true pour la relation, puis il peut y avoir plusieurs liaisons, et vous devez utiliser GetLinks:But if in the DSL definition, the Allow Duplicates flag is true for the relationship, then there might be more than one link, and you must use GetLinks:

foreach (ParentsHaveChildren link in ParentsHaveChildren.GetLinks(henry, edward)) { ... }

Il existe également d’autres méthodes pour accéder à des liens.There are also other methods for accessing links. Par exemple :For example:

foreach (ParentsHaveChildren link in ParentsHaveChildren.GetLinksToChildren(henry)) { ... }

Rôles masqués.Hidden roles. Si, dans la définition DSL, est la propriété générée est false pour un rôle particulier, puis aucune propriété n’est générée qui correspond à ce rôle.If in the DSL definition, Is Property Generated is false for a particular role, then no property is generated that corresponds to that role. Toutefois, vous pouvez toujours accéder aux liens et parcourir les liens à l’aide des méthodes de la relation :However, you can still access the links and traverse the links using the methods of the relationship:

foreach (Person p in ParentsHaveChildren.GetChildren(henry)) { ... }

L’exemple le plus fréquemment utilisée est le PresentationViewsSubject relation, un élément de modèle est liée à la forme qui l’affiche dans un diagramme :The most frequently used example is the PresentationViewsSubject relationship, which links a model element to the shape that displays it on a diagram:

PresentationViewsSubject.GetPresentation(henry)[0] as PersonShape

Le répertoire de l’élémentThe Element Directory

Vous pouvez accéder à tous les éléments dans le magasin à l’aide de l’annuaire de l’élément :You can access all the elements in the store using the element directory:

store.ElementDirectory.AllElements

Il existe également des méthodes pour la recherche d’éléments, tels que les éléments suivants :There are also methods for finding elements, such as the following:

store.ElementDirectory.FindElements(Person.DomainClassId);

store.ElementDirectory.GetElement(elementId);

L’accès aux informations de classeAccessing Class Information

Vous pouvez obtenir plus d’informations sur les classes, les relations et les autres aspects de la définition DSL.You can get information about the classes, relationships, and other aspects of the DSL definition. Par exemple :For example:

DomainClassInfo personClass = henry.GetDomainClass();

DomainPropertyInfo birthProperty =

personClass.FindDomainProperty("BirthDate")

DomainRelationshipInfo relationship =

link.GetDomainRelationship();

DomainRoleInfo sourceRole = relationship.DomainRole[0];

Les classes de l’ancêtre d’éléments de modèle sont les suivantes :The ancestor classes of model elements are as follows:

  • ModelElement - tous les éléments et les relations sont ModelElementsModelElement - all elements and relationships are ModelElements

  • ElementLink - toutes les relations sont ElementLinksElementLink - all relationships are ElementLinks

Effectuer des modifications à l’intérieur d’une TransactionPerform Changes inside a Transaction

Chaque fois que votre code de programme change rien dans le magasin, il doit le faire à l’intérieur d’une transaction.Whenever your program code changes anything in the Store, it must do so inside a transaction. Cela s’applique à tous les éléments de modèle, des relations, des formes, des diagrammes et leurs propriétés.This applies to all model elements, relationships, shapes, diagrams, and their properties. Pour plus d'informations, consultez Transaction.For more information, see Transaction.

La méthode la plus commode de gérer une transaction est un using instruction entre dans un try...catch instruction :The most convenient method of managing a transaction is with a using statement enclosed in a try...catch statement:

Store store; ...  
try  
{  
  using (Transaction transaction =  
    store.TransactionManager.BeginTransaction("update model"))  
    // Outermost transaction must always have a name.  
  {  
    // Make several changes in Store:  
    Person p = new Person(store);  
    p.FamilyTreeModel = familyTree;  
    p.Name = "Edward VI";  
    // end of changes to Store  

    transaction.Commit(); // Don't forget this!  
  } // transaction disposed here  
}  
catch (Exception ex)  
{  
  // If an exception occurs, the Store will be   
  // rolled back to its previous state.  
}  

Vous pouvez effectuer n’importe quel nombre de modifications à l’intérieur d’une transaction.You can make any number of changes inside one transaction. Vous pouvez ouvrir les nouvelles transactions à l’intérieur d’une transaction active.You can open new transactions inside an active transaction.

Pour conserver vos modifications, vous devez Commit la transaction avant sa suppression.To make your changes permanent, you should Commit the transaction before it is disposed. Si une exception se produit qui n’est pas interceptée à l’intérieur de la transaction, le magasin réinitialisera à son état avant les modifications.If an exception occurs that is not caught inside the transaction, the Store will be reset to its state before the changes.

Création d’éléments de modèleCreating Model Elements

Cet exemple ajoute un élément à un modèle existant :This example adds an element to an existing model:

FamilyTreeModel familyTree = ...; // The root of the model.         
using (Transaction t =  
    familyTree.Store.TransactionManager  
    .BeginTransaction("update model"))  
{  
  // Create a new model element   
  // in the same partition as the model root:  
  Person edward = new Person(familyTree.Partition);  
  // Set its embedding relationship:  
  edward.FamilyTreeModel = familyTree;  
          // same as: familyTree.People.Add(edward);  
  // Set its properties:  
  edward.Name = "Edward VII";  
  t.Commit(); // Don't forget this!  
}  

Cet exemple illustre ces points essentiels sur la création d’un élément :This example illustrates these essential points about creating an element:

  • Créer le nouvel élément dans une partition spécifique de la banque.Create the new element in a specific partition of the Store. Pour les éléments de modèle et des relations, mais pas les formes, il s’agit généralement de la partition par défaut.For model elements and relationships, but not shapes, this is usually the default partition.

  • Rendre la cible d’une relation d’incorporation.Make it the target of an embedding relationship. Dans la DslDefinition de cet exemple, chaque personne doit être la cible de relation FamilyTreeHasPeople d’incorporation.In the DslDefinition of this example, each Person must be the target of embedding relationship FamilyTreeHasPeople. Pour ce faire, nous pouvons définir la propriété du rôle FamilyTreeModel de l’objet de la personne, ou ajoutez cette personne à la propriété du rôle de personnes de l’objet FamilyTreeModel.To achieve this, we can either set the FamilyTreeModel role property of the Person object, or add the Person to the People role property of the FamilyTreeModel object.

  • Définir les propriétés d’un nouvel élément, en particulier la propriété pour laquelle IsName a la valeur true dans la DslDefinition.Set the properties of a new element, particularly the property for which IsName is true in the DslDefinition. Cet indicateur marque la propriété qui sert à identifier l’élément de façon unique au sein de son propriétaire.This flag marks the property that serves to identify the element uniquely within its owner. Dans ce cas, la propriété de nom a cet indicateur.In this case, the Name property has that flag.

  • La définition DSL de cette DSL doit avoir été chargée dans le magasin.The DSL definition of this DSL must have been loaded into the Store. Si vous écrivez une extension comme une commande de menu, cela sera généralement déjà être true.If you are writing an extension such as a menu command, this will typically be already true. Dans d’autres cas, vous pouvez explicitement charger le modèle dans le magasin, ou utiliser ModelBus à le charger.In other cases, you can explicitly load the model into the Store, or use ModelBus to load it. Pour plus d’informations, consultez Comment : ouvrir un modèle à partir du fichier de Code de programme.For more information, see How to: Open a Model from File in Program Code.

    Lorsque vous créez un élément de cette façon, une forme est automatiquement créée (si la DSL comporte un diagramme).When you create an element in this way, a shape is automatically created (if the DSL has a diagram). Il s’affiche dans un emplacement automatiquement affecté, avec la forme par défaut, la couleur et autres fonctionnalités.It appears in an automatically assigned location, with default shape, color, and other features. Si vous voulez contrôler comment et où la forme associée, consultez création d’un élément et sa forme.If you want to control where and how the associated shape appears, see Creating an Element and its Shape.

Il existe deux relations définies dans l’exemple de définition DSL.There are two relationships defined in the example DSL definition. Chaque relation définit une propriété role sur la classe à chaque extrémité de la relation.Each relationship defines a role property on the class at each end of the relationship.

Il existe trois façons dans laquelle vous pouvez créer une instance d’une relation.There are three ways in which you can create an instance of a relationship. Chacune de ces trois méthodes a le même effet :Each of these three methods has the same effect:

  • Définissez la propriété de l’acteur de rôle source.Set the property of the source role player. Par exemple :For example:

    • familyTree.People.Add(edward);

    • edward.Parents.Add(henry);

  • Définissez la propriété de l’acteur de rôle cible.Set the property of the target role player. Par exemple :For example:

    • edward.familyTreeModel = familyTree;

      La multiplicité de ce rôle est 1..1, donc nous affectons la valeur.The multiplicity of this role is 1..1, so we assign the value.

    • henry.Children.Add(edward);

      La multiplicité de ce rôle est 0..*, donc nous ajouter à la collection.The multiplicity of this role is 0..*, so we add to the collection.

  • Construire une instance de la relation de façon explicite.Construct an instance of the relationship explicitly. Par exemple :For example:

    • FamilyTreeHasPeople edwardLink = new FamilyTreeHasPeople(familyTreeModel, edward);

    • ParentsHaveChildren edwardHenryLink = new ParentsHaveChildren(henry, edward);

    La dernière méthode est utile si vous souhaitez définir des propriétés sur la relation elle-même.The last method is useful if you want to set properties on the relationship itself.

    Lorsque vous créez un élément de cette façon, un connecteur sur le diagramme est automatiquement créé, mais il a une forme par défaut, la couleur et autres fonctionnalités.When you create an element in this way, a connector on the diagram is automatically created, but it has a default shape, color, and other features. Pour contrôler la façon dont le connecteur associé est créé, consultez création d’un élément et sa forme.To control how the associated connector is created, see Creating an Element and its Shape.

Suppression d’élémentsDeleting Elements

Supprimer un élément en appelant Delete():Delete an element by calling Delete():

henry.Delete();

Cette opération supprimera également :This operation will also delete:

  • Relation des liens vers et à partir de l’élément.Relationship links to and from the element. Par exemple, edward.Parents ne contient plus de henry.For example, edward.Parents will no longer contain henry.

  • Éléments sur les rôles pour lesquels le PropagatesDelete indicateur a la valeur true.Elements at roles for which the PropagatesDelete flag is true. Par exemple, la forme qui affiche l’élément sera supprimée.For example, the shape that displays the element will be deleted.

    Par défaut, chaque relation incorporation a PropagatesDelete true au niveau du rôle cible.By default, every embedding relationship has PropagatesDelete true at the target role. Suppression henry ne supprime pas le familyTree, mais familyTree.Delete() supprime tous les Persons.Deleting henry does not delete the familyTree, but familyTree.Delete() would delete all the Persons. Pour plus d’informations, consultez comportement de suppression de personnalisation.For more information, see Customizing Deletion Behavior.

    Par défaut, PropagatesDelete n’est pas vrai pour les rôles de relations de référence.By default, PropagatesDelete is not true for the roles of reference relationships.

    Vous pouvez provoquer les règles de suppression omettre propagations spécifiques lorsque vous supprimez un objet.You can cause the deletion rules to omit specific propagations when you delete an object. Cela est utile si vous remplacez un élément d’un autre.This is useful if you are substituting one element for another. Vous fournissez le GUID d’un ou plusieurs rôles pour lesquels la suppression ne doit pas être propagée.You supply the GUID of one or more roles for which deletion should not be propagated. Le GUID peut être obtenu à partir de la classe de relation :The GUID can be obtained from the relationship class:

    henry.Delete(ParentsHaveChildren.SourceDomainRoleId);

    (Cet exemple particulier n’a aucun effet, car PropagatesDelete est false pour les rôles de la ParentsHaveChildren relation.)(This particular example would have no effect, because PropagatesDelete is false for the roles of the ParentsHaveChildren relationship.)

    Dans certains cas, la suppression est interdite par l’existence d’un verrou, sur l’élément ou sur un élément qui serait supprimé par propagation.In some cases, deletion is prevented by the existence of a lock, either on the element or on an element that would be deleted by propagation. Vous pouvez utiliser element.CanDelete() pour vérifier si l’élément peut être supprimé.You can use element.CanDelete() to check whether the element can be deleted.

Vous pouvez supprimer un lien de relation en supprimant un élément d’une propriété de rôle :You can delete a relationship link by removing an element from a role property:

henry.Children.Remove(edward); // or:

edward.Parents.Remove(henry); // or:

Vous pouvez également supprimer le lien explicitement :You can also delete the link explicitly:

edwardHenryLink.Delete();

Ces trois méthodes ont toutes le même effet.These three methods all have the same effect. Vous devez uniquement utiliser un d’eux.You only need to use one of them.

Si le rôle a une multiplicité de valeur 0.. 1 ou 1.. 1, vous pouvez le définir sur null, ou à une autre valeur :If the role has 0..1 or 1..1 multiplicity, you can set it to null, or to another value:

edward.FamilyTreeModel = null; ou :edward.FamilyTreeModel = null; // or:

edward.FamilyTreeModel = anotherFamilyTree;

Réorganisation sur les liens d’une relationRe-ordering the Links of a Relationship

Les liens d’une relation particulière provenant ou ciblée sur un élément de modèle particulier ont un ordre spécifique.The links of a particular relationship that are sourced or targeted at a particular model element have a specific sequence. Ils apparaissent dans l’ordre dans lequel ils ont été ajoutés.They appear in the order in which they were added. Par exemple, cette instruction donne toujours les enfants dans le même ordre :For example, this statement will always yield the children in the same order:

foreach (Person child in henry.Children) ...

Vous pouvez modifier l’ordre des liens :You can change the order of the links:

ParentsHaveChildren link = GetLink(henry,edward);

ParentsHaveChildren nextLink = GetLink(henry, elizabeth);

DomainRoleInfo role =

link.GetDomainRelationship().DomainRoles[0];

link.MoveBefore(role, nextLink);

VerrousLocks

Un verrou peuvent empêcher vos modifications.Your changes might be prevented by a lock. Verrous peuvent être définies sur le magasin pour des éléments individuels et sur les partitions.Locks can be set on individual elements, on partitions, and on the store. Si l’une de ces niveaux possède un verrou qui empêche le type de modification que vous souhaitez effectuer, une exception peut être levée lorsque vous essayez de vous.If any of these levels has a lock that prevents the kind of change that you want to make, an exception might be thrown when you attempt it. Vous pouvez découvrir si les verrous sont définis à l’aide d’élément. GetLocks(), qui est une méthode d’extension qui est définie dans l’espace de noms Microsoft.VisualStudio.Modeling.Immutability.You can discover whether locks are set by using element.GetLocks(), which is an extension method that is defined in the namespace Microsoft.VisualStudio.Modeling.Immutability.

Pour plus d’informations, consultez définition d’une stratégie de verrouillage pour créer des Segments en lecture seule.For more information, see Defining a Locking Policy to Create Read-Only Segments.

Copier et collerCopy and Paste

Vous pouvez copier des éléments ou des groupes d’éléments à un IDataObject:You can copy elements or groups of elements to an IDataObject:

Person person = personShape.ModelElement as Person;  
Person adopter = adopterShape.ModelElement as Person;  
IDataObject data = new DataObject();  
personShape.Diagram.ElementOperations  
      .Copy(data, person.Children.ToList<ModelElement>());  

Les éléments sont stockés en tant qu’un groupe d’éléments sérialisés.The elements are stored as a serialized Element Group.

Vous pouvez fusionner les éléments d’une interface IDataObject dans un modèle :You can merge elements from an IDataObject into a model:

using (Transaction t = targetDiagram.Store.  
        TransactionManager.BeginTransaction("paste"))  
{  
  adopterShape.Diagram.ElementOperations.Merge(adopter, data);  
}  

Merge () peut accepter soit un PresentationElement ou ModelElement.Merge () can accept either a PresentationElement or a ModelElement. Si vous lui donnez un PresentationElement, vous pouvez également spécifier une position sur le schéma cible en tant que troisième paramètre.If you give it a PresentationElement, you can also specify a position on the target diagram as a third parameter.

Navigation et la mise à jour des diagrammesNavigating and updating diagrams

Dans une DSL, l’élément de modèle de domaine, qui représente un concept telles que la personne ou une chanson, est distincte de l’élément de forme, qui représente ce que vous voyez sur le diagramme.In a DSL, the domain model element, which represents a concept such as Person or Song, is separate from the shape element, which represents what you see on the diagram. L’élément de modèle de domaine stocke les propriétés importantes et les relations des concepts.The domain model element stores the important properties and relationships of the concepts. L’élément forme stocke la taille, la position et la couleur de la vue de l’objet sur le diagramme et la disposition de ses composants.The shape element stores the size, position and color of the object's view on the diagram, and the layout of its component parts.

Éléments de présentationPresentation Elements

Diagramme de classes des types de forme et élément de baseClass diagram of base shape and element types

Dans votre définition DSL, chaque élément que vous spécifiez crée une classe qui est dérivée d’une des classes standards suivantes.In your DSL Definition, each element that you specify creates a class that is derived from one of the following standard classes.

Type d’élémentKind of element Classe de baseBase class
Classe de domaineDomain class ModelElement
Relation de domaineDomain relationship ElementLink
FormeShape NodeShape
ConnecteurConnector BinaryLinkShape
DiagrammeDiagram Diagram

Un élément sur un diagramme représente généralement un élément de modèle.An element on a diagram usually represents a model element. En général (mais pas toujours), un NodeShape représente une instance de classe de domaine et un BinaryLinkShape représente une instance de relation de domaine.Typically (but not always), a NodeShape represents a domain class instance, and a BinaryLinkShape represents a domain relationship instance. Le PresentationViewsSubject relation lie une forme de nœud ou un lien vers l’élément de modèle qu’il représente.The PresentationViewsSubject relationship links a node or link shape to the model element that it represents.

Chaque forme de nœud ou un lien appartient à un diagramme.Every node or link shape belongs to one diagram. Une forme de lien binaire connecte deux formes de nœud.A binary link shape connects two node shapes.

Formes peuvent avoir des formes enfants dans les deux jeux.Shapes can have child shapes in two sets. Une forme dans le NestedChildShapes jeu se limite à la zone englobante de son parent.A shape in the NestedChildShapes set is confined to the bounding box of its parent. Une forme dans le RelativeChildShapes liste peut apparaître en dehors ou partiellement en dehors des limites du parent - par exemple une étiquette ou un port.A shape in the RelativeChildShapes list can appear outside or partly outside the bounds of the parent - for example a label or a port. Un diagramme n’a aucun RelativeChildShapes et aucun Parent.A diagram has no RelativeChildShapes and no Parent.

Navigation entre les formes et des élémentsNavigating between shapes and elements

Les éléments de modèle de domaine et des éléments de forme sont liées par le PresentationViewsSubject relation.Domain model elements and shape elements are related by the PresentationViewsSubject relationship.

// using Microsoft.VisualStudio.Modeling;  
// using Microsoft.VisualStudio.Modeling.Diagrams;  
// using System.Linq;  
Person henry = ...;  
PersonShape henryShape =   
  PresentationViewsSubject.GetPresentation(henry)  
    .FirstOrDefault() as PersonShape;  

La même relation lie des relations aux connecteurs du diagramme :The same relationship links relationships to connectors on the diagram:

Descendants link = Descendants.GetLink(henry, edward);  
DescendantConnector dc =  
   PresentationViewsSubject.GetPresentation(link)  
     .FirstOrDefault() as DescendantConnector;  
// dc.FromShape == henryShape && dc.ToShape == edwardShape  

Cette relation lie également la racine du modèle vers le diagramme :This relationship also links the root of the model to the diagram:

FamilyTreeDiagram diagram =   
   PresentationViewsSubject.GetPresentation(familyTree)  
      .FirstOrDefault() as FamilyTreeDiagram;  

Pour obtenir l’élément de modèle représenté par une forme, utilisez :To get the model element represented by a shape, use:

henryShape.ModelElement as Person

diagram.ModelElement as FamilyTreeModel

En règle générale, il n’est pas conseillé pour naviguer entre les formes et connecteurs du diagramme.In general it is not advisable to navigate between shapes and connectors on the diagram. Il est préférable de parcourir les relations dans le modèle, le déplacement entre les formes et connecteurs uniquement lorsqu’il est nécessaire travailler sur l’apparence du diagramme.It is better to navigate the relationships in the model, moving between the shapes and connectors only when it is necessary to work on the appearance of the diagram. Ces méthodes lier des connecteurs vers les formes à chaque extrémité :These methods link connectors to the shapes at each end:

personShape.FromRoleLinkShapes, personShape.ToRoleLinkShapes

connector.FromShape, connector.ToShape

De nombreuses formes sont composites ; elles sont constituées d’une forme parent et une ou plusieurs couches d’enfants.Many shapes are composites; they are made up of a parent shape and one or more layers of children. Les formes sont positionnés par rapport à une autre forme sont dits son enfants.Shapes that are positioned relative to another shape are said to be its children. Lorsque la forme parent se déplace, les enfants se déplacent avec lui.When the parent shape moves, the children move with it.

Les enfants relatifs peut apparaître en dehors de la zone englobante de la forme parente.Relative children can appear outside the bounding box of the parent shape. Imbriqué enfants apparaissent uniquement dans les limites du parent.Nested children appear strictly inside the bounds of the parent.

Pour obtenir le jeu du haut des formes sur un diagramme, utilisez :To obtain the top set of shapes on a diagram, use:

Diagram.NestedChildShapes

Les classes de l’ancêtre de formes et connecteurs sont :The ancestor classes of shapes and connectors are:

ModelElement

-- PresentationElement

-- ShapeElement

----- NodeShape

------- Diagram

------- YourShape------- YourShape

----- LinkShape

------- BinaryLinkShape

--------- YourConnector--------- YourConnector

Propriétés des formes et des connecteursProperties of Shapes and Connectors

Dans la plupart des cas, il n’est pas nécessaire apporter des modifications explicites aux formes.In most cases, it is not necessary to make explicit changes to shapes. Lorsque vous avez modifié les éléments de modèle, les règles de « correction du » mettre à jour les formes et connecteurs.When you have changed the model elements, the "fix up" rules update the shapes and connectors. Pour plus d’informations, consultez réponse aux et propager les modifications.For more information, see Responding to and Propagating Changes.

Toutefois, il est utile apporter des modifications explicites aux formes dans les propriétés qui sont indépendantes des éléments de modèle.However, it is useful to make some explicit changes to shapes in properties that are independent of the model elements. Par exemple, vous pouvez modifier ces propriétés :For example, you could change these properties:

  • Size -Détermine la hauteur et la largeur de la forme.Size - determines the height and width of the shape.

  • Location -position par rapport à la forme parente ou le schémaLocation - position relative to the parent shape or diagram

  • StyleSet -l’ensemble des stylets et pinceaux utilisé pour dessiner la forme ou un connecteurStyleSet - the set of pens and brushes used for drawing the shape or connector

  • Hide -rend la forme invisibleHide - makes the shape invisible

  • Show -Affiche la forme après une Hide()Show - makes the shape visible after a Hide()

Création d’un élément et sa formeCreating an Element and its Shape

Lorsque vous créez un élément et la relier dans l’arborescence de l’incorporation des relations, une forme est automatiquement créée et associée.When you create an element and link it into the tree of embedding relationships, a shape is automatically created and associated with it. Cela est effectué par les règles de « correction » qui s’exécutent à la fin de la transaction.This is done by the "fixup" rules that execute at the end of the transaction. Toutefois, la forme apparaît dans un emplacement affecté automatiquement et sa forme, de couleur et d’autres fonctionnalités auront des valeurs par défaut.However, the shape will appear in an automatically-assigned location, and its shape, color and other features will have default values. Pour contrôler la façon dont la forme est créée, vous pouvez utiliser la fonction de fusion.To control how the shape is created, you can use the merge function. Vous devez d’abord ajouter les éléments que vous souhaitez ajouter dans un ElementGroup et puis de fusionner le groupe dans le diagramme.You must first add the elements you want to add into an ElementGroup, and then merge the group into the diagram.

Cette méthode :This method:

  • Définit le nom, si vous avez attribué une propriété en tant que nom de l’élément.Sets the name, if you have assigned a property as the element name.

  • Observe toutes les Directives fusionner l’élément que vous avez spécifié dans la définition DSL.Observes any Element Merge Directives that you specified in the DSL Definition.

    Cet exemple crée une forme à la position de la souris, lorsque l’utilisateur double-clique sur le diagramme.This example creates a shape at the mouse position, when the user double-clicks the diagram. Dans la définition DSL pour cet exemple, le FillColor propriété du ExampleShape a été exposé.In the DSL Definition for this sample, the FillColor property of ExampleShape has been exposed.


using Microsoft.VisualStudio.Modeling;  
using Microsoft.VisualStudio.Modeling.Diagrams;  
partial class MyDiagram  
{  
  public override void OnDoubleClick(DiagramPointEventArgs e)  
  {  
    base.OnDoubleClick(e);  

    using (Transaction t = this.Store.TransactionManager  
        .BeginTransaction("double click"))  
    {  
      ExampleElement element = new ExampleElement(this.Store);  
      ElementGroup group = new ElementGroup(element);  

      { // To use a shape of a default size and color, omit this block.  
        ExampleShape shape = new ExampleShape(this.Partition);  
        shape.ModelElement = element;  
        shape.AbsoluteBounds = new RectangleD(0, 0, 1.5, 1.0);  
        shape.FillColor = System.Drawing.Color.Azure;  
        group.Add(shape);  
      }  

      this.ElementOperations.MergeElementGroupPrototype(  
        this,  
        group.CreatePrototype(),  
        PointD.ToPointF(e.MousePosition));  
      t.Commit();  
    }  
  }  
}  

Si vous fournissez plusieurs formes, définir leurs positions relatives à l’aide de la AbsoluteBounds.If you provide more than one shape, set their relative positions using the AbsoluteBounds.

Vous pouvez également définir la couleur et autres propriétés exposées des connecteurs à l’aide de cette méthode.You can also set the color and other exposed properties of connectors using this method.

Utiliser des TransactionsUse Transactions

Formes, les connecteurs et les diagrammes sont des sous-types de ModelElement et actives dans le magasin.Shapes, connectors and diagrams are subtypes of ModelElement and live in the Store. Vous devez donc modifier leur uniquement à l’intérieur d’une transaction.You must therefore make changes to them only inside a transaction. Pour plus d’informations, consultez Comment : utiliser les Transactions pour mettre à jour le modèle.For more information, see How to: Use Transactions to Update the Model.

Affichage du document et les données du DocumentDocument View and Document Data

Diagramme de classes des types de diagramme standardClass diagram of standard diagram types

Stocker les PartitionsStore Partitions

Lorsqu’un modèle est chargé, le diagramme qui l’accompagne est chargé en même temps.When a model is loaded, the accompanying diagram is loaded at the same time. En règle générale, le modèle est chargé dans Store.DefaultPartition, et le contenu de schéma est chargé dans une autre Partition.Typically, the model is loaded into Store.DefaultPartition, and the diagram content is loaded into another Partition. En règle générale, le contenu de chaque partition est chargé et enregistré dans un fichier séparé.Usually, the content of each partition is loaded and saved to a separate file.

Voir aussiSee Also

ModelElement
Validation dans un langage spécifique à un domaine Validation in a Domain-Specific Language
Génération de Code à partir d’un langage spécifique à un domaine Generating Code from a Domain-Specific Language
Comment : utiliser des Transactions pour mettre à jour le modèle How to: Use Transactions to Update the Model
Intégration de modèles à l’aide de Visual Studio Modelbus Integrating Models by using Visual Studio Modelbus
Propagation et réponse aux modificationsResponding to and Propagating Changes