如何:从 IDataObject 获取 UML 模型元素
当用户将元素从任何源拖动到关系图上时,被拖动的元素将被编码到 System.Windows.Forms.IDataObject 中。 编码取决于源对象的类型。 下面的代码片段演示如何在源为 UML 关系图时检索元素。
提示
必须对 UML 模型执行的大多数操作可使用在 Microsoft.VisualStudio.Uml.Interfaces 和 Microsoft.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 - 域特定语言。