Поделиться через


Практическое руководство. Получение элементов модели UML из IDataObject

Когда пользователь перетаскивает элементы из любого источника на схему, перетащенные элементы кодируются в System.Windows.Forms.IDataObject.Кодировка зависит от типа исходного объекта.В следующем фрагменте кода показано, как извлекать элементы, если источником является UML-схема.

ПримечаниеПримечание

Большинство операций, которые приходится выполнять с моделями UML, можно осуществить с использованием типов, определенных в сборках Microsoft.VisualStudio.Uml.Interfaces и Microsoft.VisualStudio.ArchitectureTools.Extensibility.Но для этого нужно использовать некоторые классы, которые являются частью реализации средств моделирования UML.Например, ShapeElement в этом фрагменте не является идентичным IShape на UML-схеме.Чтобы снизить риск приведения модели UML и схем в несовместимое состояние, не рекомендуется использовать вышеупомянутые методы при работе с данными классами реализации, за исключением случаев, когда альтернативы отсутствуют.

Пример кода

Проект должен содержать ссылки на следующие сборки .NET.

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

Дополнительные сведения о ElementGroupPrototype и Store, в которых реализуются средства моделирования UML, см. в разделе Пакет SDK визуализации и моделирования — доменные языки.

См. также

Основные понятия

Программирование с UML API

Практическое руководство. Определение команды меню на схеме моделирования