Postupy: Získávání elementů modelu UML z objektu IDataObject
Když uživatel přetáhne prvky z libovolného zdroje do diagramu, přetažené prvky jsou zakódovány do System.Windows.Forms.IDataObject.Kódování závisí na typu zdrojového objektu.Následující fragment ukazuje, jak načíst prvky, pokud je zdroj diagram UML.
[!POZNÁMKA]
Většinu operací, které je nutné provést v modelech UML, lze provést pomocí typů definovaných v sestaveních Microsoft.VisualStudio.Uml.Interfaces a Microsoft.VisualStudio.ArchitectureTools.Extensibility.Ale pro tento účel je nutné použít některé třídy, které jsou součástí implementace nástroje modelu UML.Například ShapeElement v tomto fragmentu není stejný jako UML IShape.Aby se snížilo riziko uvedení modelu a diagramů do nekonzistentního stavu, je lepší vyhýbat se použití metod na tyto třídy implementace, jedině pokud neexistuje žádná alternativa.
Ukázka kódu
Váš projekt musí odkazovat na následující sestavení .NET:
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;
}
});
}
Další informace o ElementGroupPrototype a Store, kde jsou implementovány nástroje modelování UML, viz Sada Modeling SDK pro sadu Visual Studio – jazyky domény.