Como: obter elementos de modelo UML do IDataObject
Quando o usuário arrasta elementos de qualquer origem para um diagrama, os elementos arrastados são codificados em um System.Windows.Forms.IDataObject.A codificação depende do tipo de objeto de origem.O fragmento a seguir demonstra como recuperar os elementos quando a fonte é um diagrama UML.
Observação |
---|
A maioria das operações que você precisa fazer em modelos UML pode ser realizada usando os tipos no definidos nos assemblies do Microsoft.VisualStudio.Uml.Interfaces e Microsoft.VisualStudio.ArchitectureTools.Extensibility.Mas, para esse fim, você precisa usar algumas classes que fazem parte da implementação de ferramentas de modelagem UML.Por exemplo, ShapeElement neste fragmento não é o mesmo que o UML IShape.Para reduzir o risco de colocar o modelo UML e os diagramas em um estado inconsistente, é melhor evitar o uso dos métodos dessas classes de implementação, exceto onde não há nenhuma alternativa. |
Seu projeto deve fazer referência a seguir .NET assemblies:
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 obter mais informações sobre ElementGroupPrototype e o Store em que as ferramentas de modelagem UML são implementadas, consulte Visualização e modelagem SDK - linguagens específicas de domínio.
Como: definir um comando de Menu em um diagrama de modelagem