Condividi tramite


Procedura: ottenere elementi di modelli UML da IDataObject

Quando l'utente trascina elementi da qualsiasi origine in un diagramma, gli elementi trascinati vengono codificati in System.Windows.Forms.IDataObject. La codifica dipende dal tipo di oggetto di origine. Nel frammento di codice seguente viene illustrato come recuperare gli elementi quando l'origine è un diagramma UML.

Nota

La maggior parte delle operazioni che è necessario eseguire sui modelli UML può essere effettuata utilizzando i tipi definiti negli assembly Microsoft.VisualStudio.Uml.Interfaces e Microsoft.VisualStudio.ArchitectureTools.Extensibility. A tale scopo, è però necessario utilizzare alcune classi che fanno parte dell'implementazione degli strumenti di modellazione UML. Ad esempio, ShapeElement in questo frammento non corrisponde a IShape UML. Per ridurre il rischio di collocare il modello UML e i diagrammi in uno stato incoerente, è preferibile evitare di utilizzare i metodi in queste classi di implementazione, ad eccezione dei casi in cui non vi siano alternative.

Esempio di codice

Il progetto deve fare riferimento agli assembly .NET seguenti:

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

Per ulteriori informazioni su ElementGroupPrototype e Store in cui vengono implementati gli strumenti di modellazione UML, vedere SDK di visualizzazione e modellazione (linguaggi specifici di dominio).

Vedere anche

Concetti

Programmazione con l'API UML

Procedura: definire un comando di menu in un diagramma di modellazione