Nasıl yapılır: UML Model Öğelerini IDataObject'den Alma
Kullanıcı, öğeleri herhangi bir kaynaktan diyagram üzerine sürüklediğinde, sürüklenen öğeler System.Windows.Forms.IDataObject içinde kodlanır. Kodlama, kaynak nesnenin türüne bağlıdır. Aşağıdaki bölüm, kaynak UML diyagram olduğunda öğelerin nasıl alındığını gösterir.
Not
UML modeller üzerinde yapmak zorunda olduğunuz işlemlerin çoğu, Microsoft.VisualStudio.Uml.Interfaces ve Microsoft.VisualStudio.ArchitectureTools.Extensibility derlemelerinde tanımlı türleri kullanarak gerçekleştirilebilir. Ancak bu amaç için, UML modelleme araçları uygulamasının parçaları olan bazı sınıfları kullanmanız gerekir. Örneğin, ShapeElement bu bölümde UML gibi aynı değildirIShape. UML model ve diyagramlarını tutarlı bir durumun içine koyma riskini azaltmak için, alternatifinin olmadığı yerlerde yöntemleri bu uygulama sınıfları üzerinde kullanmaktan kaçınmak daha iyidir.
Örnek Kod
Projeniz aşağıdaki .NET derlemelerine başvurmalıdır:
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;
}
});
}
UML modelleme araçlarının uygulandığı ElementGroupPrototype ve Store hakkında daha fazla bilgi için bkz. Domain-Specific Languages.