Практическое руководство. Получение элементов модели 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 визуализации и моделирования — доменные языки.
См. также
Основные понятия
Практическое руководство. Определение команды меню на схеме моделирования