Compartir a través de


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.

NotaNota

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.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;
          }
        });
    }

Para obtener más información sobre ElementGroupPrototype y Store en los que se implementan las herramientas de modelado UML, vea Modelar el SDK de Visual Studio - Lenguajes específicos de dominio.

Vea también

Conceptos

Programar con la API de UML

Cómo: Definir un comando de menú en un diagrama de modelado