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çãoObservaçã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.

Exemplo de código

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.

Consulte também

Conceitos

Programação com a API de UML

Como: definir um comando de Menu em um diagrama de modelagem