HOW TO:從 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.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 - 網域指定的語言。