Partager via


Comment : obtenir de l'interface IDataObject des éléments de modèles UML

Lorsque l'utilisateur fait glisser des éléments à partir d'une source quelconque vers un diagramme, les éléments déplacés sont encodés dans un System.Windows.Forms.IDataObject. L'encodage dépend du type d'objet source. Le fragment suivant montre comment extraire les éléments lorsque la source est un diagramme UML.

Notes

La plupart des opérations que vous devez effectuer sur les modèles UML peuvent l'être à l'aide des types définis dans les assemblys Microsoft.VisualStudio.Uml.Interfaces et Microsoft.VisualStudio.ArchitectureTools.Extensibility. Pour cela, vous devez utiliser des classes qui font partie de l'implémentation des outils de modélisation UML. Par exemple, ShapeElement dans ce fragment n'est pas identique à IShape UML. Pour réduire le risque de mettre le modèle et les diagrammes UML dans un état incohérent, il est préférable d'éviter d'utiliser les méthodes sur ces classes d'implémentation, sauf s'il n'existe pas d'alternative.

Exemple de code

Votre projet doit référencer les assemblys .NET suivants :

Microsoft.VisualStudio.Modeling.Sdk.10.0

Microsoft.VisualStudio.Modeling.Sdk.Diagrams.10.0

System.Windows.Forms

using Microsoft.VisualStudio.Modeling;  
  // for ElementGroupPrototype
using Microsoft.VisualStudio.Modeling.Diagrams;  
  // for ShapeElement, DiagramDragEventArgs, DiagramPointEventArgs
… 
  /// <summary>
  /// Retrieves UML IElements from drag arguments.
  /// Works for drags from UML diagrams.
  /// </summary>
  private IEnumerable<IElement> GetModelElementsFromDragEvent
                  (DiagramDragEventArgs dragEvent)
  {
     //ElementGroupPrototype is the container for
     //dragged and copied elements and toolbox items.
     ElementGroupPrototype prototype =
        dragEvent.Data.
        GetData(typeof(ElementGroupPrototype))
                     as ElementGroupPrototype;
     // Locate the originals in the implementation store.
     IElementDirectory implementationDirectory = 
        dragEvent.DiagramClientView.Diagram.Store.ElementDirectory;
     
     return  prototype.ProtoElements.Select(
       prototypeElement => 
       {
          ModelElement element = implementationDirectory
                .FindElement(prototypeElement.ElementId);
          ShapeElement shapeElement = element as ShapeElement;
          if (shapeElement != null)
          { 
            // Dragged from a diagram.
            return shapeElement.ModelElement as IElement;
          }
          else
          { 
            // Dragged from UML Model Explorer.
            return element as IElement;
          }
        });
    }

Pour plus d'informations sur ElementGroupPrototype et le Store dans lesquels les outils de modélisation UML sont implémentés, consultez Visualisation et modélisation du kit de développement logiciel (SDK) - Langages spécifiques à un domaine.

Voir aussi

Autres ressources

Programmation à l'aide de l'API UML

Comment : définir une commande de menu sur un diagramme de modélisation