Aktualizace obrazců a konektorů k vyjádření modelu
V jazyce specifickém pro doménu v sadě Visual Studio můžete vzhled obrazce odrážet stav základního modelu.
Příklady kódu v tomto tématu by se měly přidat do .cs
souboru v Dsl
projektu. V každém souboru potřebujete tyto direktivy:
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
Nastavení vlastností mapy obrazců pro řízení viditelnosti dekorátoru
Viditelnost dekorátoru můžete řídit bez psaní kódu programu tak, že v definici DSL nakonfigurujete mapování mezi obrazcem a třídou domény. Další informace naleznete v tématu Definování jazyka specifického pro doménu.
Zveřejnění barvy a stylu obrazce jako vlastností
V definici DSL klepněte pravým tlačítkem myši na třídu obrazce, přejděte na přidat vystavené a potom klikněte na jednu z položek, jako je například barva výplně.
Obrazec teď má vlastnost domény, kterou můžete nastavit v kódu programu nebo jako uživatel. Pokud ho například chcete nastavit v kódu programu příkazu nebo pravidla, můžete napsat:
shape.FillColor = System.Drawing.Color.Red;
Pokud chcete proměnnou vlastnosti nastavit pouze v rámci ovládacího prvku programu, a ne uživatelem, vyberte novou vlastnost domény, jako je například barva výplně v diagramu definice DSL. Pak v okno Vlastnosti nastavte Is Browsable na false
nebo nastavit Is UI Readonly na true
.
Definování pravidel změn pro nastavení barvy, stylu nebo umístění závisí na vlastnostech prvku modelu
Můžete definovat pravidla, která aktualizují vzhled obrazce závislého na jiných částech modelu. Můžete například definovat pravidlo změny u prvku modelu, který aktualizuje barvu jeho obrazce závislé na vlastnostech prvku modelu. Další informace o pravidlech změn naleznete v tématu Pravidla šíření změn v rámci modelu.
Pravidla byste měli použít pouze k aktualizaci vlastností, které jsou zachovány v úložišti, protože pravidla nejsou vyvolána při provedení příkazu Zpět. Nezahrnuje některé grafické funkce, jako je velikost a viditelnost obrazce. Pokud chcete tyto funkce obrazce aktualizovat, přečtěte si článek Aktualizace grafických funkcí, které nejsou uložené v úložišti.
Následující příklad předpokládá, že jste vystaveni FillColor
jako vlastnost domény, jak je popsáno v předchozí části.
[RuleOn(typeof(ExampleElement))]
class ExampleElementPropertyRule : ChangeRule
{
public override void ElementPropertyChanged(ElementPropertyChangedEventArgs e)
{
base.ElementPropertyChanged(e);
ExampleElement element = e.ModelElement as ExampleElement;
// The rule is called for every property that is updated.
// Therefore, verify which property changed:
if (e.DomainProperty.Id == ExampleElement.NameDomainPropertyId)
{
// There is usually only one shape:
foreach (PresentationElement pel in PresentationViewsSubject.GetPresentation(element))
{
ExampleShape shape = pel as ExampleShape;
// Replace this with a useful condition:
shape.FillColor = element.Name.EndsWith("3")
? System.Drawing.Color.Red : System.Drawing.Color.Green;
}
}
}
}
// The rule must be registered:
public partial class OnAssociatedPropertyExptDomainModel
{
protected override Type[] GetCustomDomainModelTypes()
{
List<Type> types = new List<Type>(base.GetCustomDomainModelTypes());
types.Add(typeof(ExampleElementPropertyRule));
// If you add more rules, list them here.
return types.ToArray();
}
}
Inicializace vlastností obrazce pomocí OnChildConfigured
Chcete-li nastavit vlastnosti obrazce při prvním vytvoření, přepsání OnChildConfigured()
v částečné definici třídy diagramu. Třída diagramu je zadána v definici DSL a vygenerovaný kód je v Dsl\Generated Code\Diagram.cs. Příklad:
partial class MyLanguageDiagram
{
protected override void OnChildConfigured(ShapeElement child, bool childWasPlaced, bool createdDuringViewFixup)
{
base.OnChildConfigured(child, childWasPlaced, createdDuringViewFixup);
ExampleShape shape = child as ExampleShape;
if (shape != null)
{
if (!createdDuringViewFixup) return; // Ignore load from file.
ExampleElement element = shape.ModelElement as ExampleElement;
// Replace with a useful condition:
shape.FillColor = element.Name.EndsWith("3")
? System.Drawing.Color.Red : System.Drawing.Color.Green;
}
// else deal with other types of shapes and connectors.
}
}
Tuto metodu lze použít jak pro vlastnosti domény, tak pro funkce, které nejsou uložené, například velikost obrazce.
Aktualizace dalších funkcí obrazce pomocí AssociateValueWith()
U některých funkcí obrazce, například jestli má stín nebo styl šipky spojnice, neexistuje žádná integrovaná metoda zveřejnění funkce jako vlastnosti domény. Změny těchto funkcí nejsou pod kontrolou transakčního systému. Proto není vhodné je aktualizovat pomocí pravidel, protože pravidla nejsou vyvolána, když uživatel provede příkaz Zpět.
Místo toho můžete tyto funkce aktualizovat pomocí OnAssociatedPropertyChanged. V následujícím příkladu je styl šipky spojnice řízen hodnotou vlastnosti domény v relaci, kterou spojnice zobrazuje:
public partial class ArrowConnector // My connector class.
{
/// <summary>
/// Called whenever a registered property changes in the associated model element.
/// </summary>
/// <param name="e"></param>
protected override void OnAssociatedPropertyChanged(VisualStudio.Modeling.Diagrams.PropertyChangedEventArgs e)
{
base.OnAssociatedPropertyChanged(e);
// Can be called for any property change. Therefore,
// Verify that this is the property we're interested in:
if ("IsDirected".Equals(e.PropertyName))
{
if (e.NewValue.Equals(true))
{ // Update the shape's built-in Decorator feature:
this.DecoratorTo = LinkDecorator.DecoratorEmptyArrow;
}
else
{
this.DecoratorTo = null; // No arrowhead.
}
}
}
// OnAssociatedPropertyChanged is called only for properties
// that have been registered using AssociateValueWith().
// InitializeResources is a convenient place to call this.
// This method is invoked only once per class, even though
// it is an instance method.
protected override void InitializeResources(StyleSet classStyleSet)
{
base.InitializeResources(classStyleSet);
AssociateValueWith(this.Store, Wire.IsDirectedDomainPropertyId);
// Add other properties here.
}
}
AssociateValueWith()
měla by být volána jednou pro každou vlastnost domény, kterou chcete zaregistrovat. Po zavolání se všechny změny zadané vlastnosti budou volat OnAssociatedPropertyChanged()
v libovolných obrazcích, které představují prvek modelu vlastnosti.
Pro každou instanci není nutné volat AssociateValueWith()
. Ačkoli InitializeResources je metoda instance, je vyvolána pouze jednou pro každou třídu obrazce.