Freigeben über


Gewusst wie: Abrufen von UML-Modellelementen aus IDataObject

Wenn der Benutzer Elemente aus einer Quelle in ein Diagramm zieht, werden diese Elemente in einem System.Windows.Forms.IDataObject codiert. Die Codierung hängt vom Typ des Quellobjekts ab. Das folgende Fragment zeigt, wie die Elemente abgerufen werden, wenn die Quelle ein UML-Diagramm ist.

Tipp

Für die meisten Vorgänge, die Sie für UML-Modelle ausführen müssen, können Sie die definierten Typen in den Assemblys Microsoft.VisualStudio.Uml.Interfaces und Microsoft.VisualStudio.ArchitectureTools.Extensibility verwenden. Zu diesem Zweck müssen Sie jedoch einige Klassen verwenden, die Teil der Implementierung der UML-Modellierungstools sind. ShapeElement in diesem Fragment ist z. B. nicht mit der UML-Klasse IShape identisch. Um das Risiko von Inkonsistenzen im UML-Modell und in den Diagrammen zu reduzieren, sollten die Methoden nun dann für diese Implementierungsklassen verwendet werden, wenn es keine Alternative gibt.

Codebeispiel

Das Projekt muss auf die folgenden .NET-Assemblys verweisen:

Microsoft.VisualStudio.Modeling.Sdk.10.0

Microsoft.VisualStudio.Modeling.Sdk.Diagrams.10.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;
          }
        });
    }

Weitere Informationen zu ElementGroupPrototype und dem Store, in dem die UML-Modellierungstools implementiert werden, finden Sie unter Visualisierungs- und Modellierungs-SDK - Domänenspezifische Sprachen.

Siehe auch

Weitere Ressourcen

Programmieren mit der UML-API

Gewusst wie: Definieren eines Menübefehls in einem Modellierungsdiagramm