如何:从 IDataObject 获取 UML 模型元素

当用户将元素从任何源拖动到关系图上时,被拖动的元素将被编码到 System.Windows.Forms.IDataObject 中。 编码取决于源对象的类型。 下面的代码片段演示如何在源为 UML 关系图时检索元素。

提示

必须对 UML 模型执行的大多数操作可使用在 Microsoft.VisualStudio.Uml.InterfacesMicrosoft.VisualStudio.ArchitectureTools.Extensibility 程序集中定义的类型来执行。 但为此,您使用的一些类必须属于 UML 建模工具实现中的一部分。 例如,此片段中的 ShapeElement 与 UML IShape 不相同。 为降低使 UML 模型和关系图处于不一致状态的风险,最好是不要对这些实现类使用方法,除非没有备用方法。

代码示例

您的项目必须引用以下 .NET 程序集:

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

有关 ElementGroupPrototype 和在其中实现 UML 建模工具的 Store 的更多信息,请参见可视化和建模 SDK - 域特定语言

请参见

概念

使用 UML API 编程

如何:在建模图上定义菜单命令