Přizpůsobení nástrojů elementu
V některých definic DSL představují jediný pojem jako prvků.Například pokud vytvoříte model, ve kterém má součást pevnou sadu portů, vždy chcete porty mohou být vytvořeny současně své nadřazené komponenty.Proto máte vlastní nástroj pro vytváření prvků tak, že vytvoří prvků namísto jen jeden.K dosažení tohoto lze upravit, jak je nástroj pro vytváření prvek inicializován.
Můžete přepsat, co se stane, když nástroj přetažen diagramu nebo prvku.
Přizpůsobení obsahu prvku nástroje
Každý prvek nástroj uloží instanci ElementGroupPrototype (EGP), která obsahuje sériové verze jednoho nebo více prvků modelu a odkazy.Ve výchozím nastavení obsahuje jednu instanci třídy, který zadáte pro nástroj EGP prvek nástroje.Toto nastavení můžete změnit přepsáním YourLanguageToolboxHelper.CreateElementToolPrototype.Tato metoda je volána při načtení balíčku DSL.
Parametr metody je ID třídy zadané v definici DSL.Při volání metody pomocí třídy, která vás zajímají, můžete přidat další prvky do EGP.
EGP musí zahrnovat vložení odkazy od jednoho prvku hlavní a pomocné prvky.Můžete také zahrnout odkazy.
Následující příklad vytvoří hlavní prvek a dvou vložené prvky.Hlavní třída se nazývá odpor a má dva vztahy vkládání prvků s názvem Terminal.Vkládání Vlastnosti rolí jsou s názvem Terminal1 a Terminal2 a mají oba velkému 1..1.
using Microsoft.VisualStudio.Modeling; ...
public partial class CircuitDiagramToolboxHelper
{
protected override ElementGroupPrototype CreateElementToolPrototype(Store store, Guid domainClassId)
{
// A case for each tool to customize:
if (domainClassId == Resistor.DomainClassId)
{
// Set up the prototype elements and links:
Resistor resistor = new Resistor(store);
resistor.Terminal1 = new Terminal(store);
resistor.Terminal2 = new Terminal(store);
resistor.Terminal1.Name = "T1"; // embedding
resistor.Terminal2.Name = "T2"; // embedding
// We could also set up reference links.
// Create an element group prototype for the toolbox:
ElementGroup egp = new ElementGroup(store.DefaultPartition);
egp.AddGraph(resistor, true);
// We do not have to explicitly include embedded children.
return egp.CreatePrototype();
}
// Element tools for other classes:
else
return base.CreateElementToolPrototype(store, domainClassId);
}
}