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.12.0
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.12.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 Kit de développement logiciel de modélisation pour Visual Studio - Langages spécifiques à un domaine.
Voir aussi
Concepts
Programmation à l'aide de l'API UML
Comment : définir une commande de menu sur un diagramme de modélisation