Cómo: Obtener elementos del modelo UML a partir de IDataObject
Cuando el usuario arrastra elementos desde cualquier origen a un diagrama, los elementos arrastrados se codifican en un objeto System.Windows.Forms.IDataObject.La codificación depende del tipo de objeto de origen.El siguiente fragmento muestra cómo recuperar los elementos cuando el origen es un diagrama UML.
[!NOTA]
La mayoría de las operaciones que deben realizarse en los modelos UML pueden llevarse a cabo utilizando los tipos definidos en los ensamblados Microsoft.VisualStudio.Uml.Interfaces y Microsoft.VisualStudio.ArchitectureTools.Extensibility.Sin embargo, para este propósito, es necesario utilizar algunas clases que formen parte de la implementación de las herramientas de modelado UML.Por ejemplo, ShapeElement en este fragmento no es igual que el objeto IShape UML.Para reducir el riesgo de provocar un estado incoherente en el modelo y diagramas UML, es mejor evitar el uso de los métodos en estas clases de implementación, excepto si no hay ninguna alternativa.
Ejemplo de código
El proyecto debe hacer referencia a los ensamblados de .NET siguientes:
Microsoft.VisualStudio.Modeling.Sdk.11.0
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.11.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;
}
});
}
Para obtener más información sobre ElementGroupPrototype y Store en los que se implementan las herramientas de modelado UML, vea SDK de modelado y virtualización - Lenguajes específicos de dominio.