方法: IDataObject から UML モデル要素を取得する
ユーザーが任意のソースから要素を 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.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;
}
});
}
UML モデリング ツールが実装されている ElementGroupPrototype および Store の詳細については、「Visualization and Modeling SDK - ドメイン固有言語」を参照してください。