Aggiornamento di forme e di connettori per riflettere il modello
In un linguaggio specifico di dominio in Visual Studio, è possibile fare l'apparizione di una forma base allo stato del modello sottostante.
Gli esempi di codice riportati in questo argomento devono essere aggiunte a un oggetto .cs file in Dsl progetto.È necessario disporre di queste istruzioni in ogni file:
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
Impostare le proprietà di un mapping della forma per controllare la visibilità di un elemento Decorator
È possibile controllare la visibilità di un elemento Decorator senza scrivere codice programma, configurando il mapping tra la forma e la classe di dominio nella definizione di modello DSL.Per ulteriori informazioni, vedere i seguenti argomenti:
Esporre il colore e lo stile di una forma come proprietà
Nella definizione di modello DSL, fare clic con il pulsante destro del mouse sulla classe di formato, quindi aggiungere espostoquindi fare clic su uno degli elementi come colore di riempimento.
La forma dispone ora di una proprietà di dominio che è possibile impostare nel codice programma o come utente.Ad esempio, per impostarlo nel codice del programma di un comando o di una regola, è possibile scrivere:
shape.FillColor = System.Drawing.Color.Red;
Se si desidera che la variabile della proprietà solo nel controllo del programma e non dall'utente, selezionare la nuova proprietà di dominio come colore di riempimento nel diagramma di definizione DSL.Quindi, nella Finestra Proprietà, impostare È visualizzabile in false o set è l'interfaccia utente di sola lettura in true.
Definire regole di modifica fare il colore, stile o il percorso dipende dalle proprietà degli elementi del modello
È possibile definire regole che aggiornano l'aspetto del dipendente di forma con altre parti del modello.Ad esempio, è possibile definire una regola di modifica su un elemento del modello che aggiorna il colore del dipendente di forma sulle proprietà dell'elemento del modello.Per ulteriori informazioni sulle regole di modifica, vedere Le regole propagano le modifiche all'interno del modello.
È consigliabile utilizzare le regole aggiornare solo le proprietà che vengono gestiti all'interno dell'archivio, in quanto le regole non vengono richiamate quando il comando di annullamento viene eseguito.Ciò non implica alcune funzionalità grafiche come la dimensione e la visibilità di una forma.Per aggiornare tali funzionalità di una forma, vedere Aggiornare le funzionalità grafiche di Archivio.
Nell'esempio si presuppone che sia stata esposta FillColor come proprietà di dominio come descritto nella sezione precedente.
[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();
}
}
utilizzo OnChildConfigured inizializzare le proprietà di una forma
Per impostare le proprietà di una forma momento in cui ne viene creata, l'override OnChildConfigured() in una definizione parziale della classe del diagramma.La classe del diagramma nella definizione non è specificato DSL e il codice generato è in Dsl\Generated Code\Diagram.cs.Di seguito è riportato un esempio:
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.
}
}
Questo metodo può essere utilizzato sia per le proprietà di dominio che le funzionalità di archivio, come la dimensione della forma.
utilizzare AssociateValueWith() per aggiornare altre funzionalità di una forma
Per alcune funzionalità di una forma, come se ha un'ombreggiatura, o lo stile di freccia del connettore, non esiste alcun metodo incorporato di esporre la funzionalità come proprietà di dominio.Le modifiche apportate a tali funzionalità non sono inclusi nel controllo del sistema delle transazioni.Di conseguenza, non è appropriato per utilizzando le regole, in quanto le regole non vengono richiamate quando si esegue il comando di annullamento.
In alternativa, è possibile aggiornare tali funzionalità tramite OnAssociatedPropertyChanged.Nell'esempio seguente, lo stile di freccia del connettore viene controllato da un valore di una proprietà del dominio in relazione alle visualizzazioni del connettore:
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() deve essere chiamato una volta per ogni proprietà di dominio che si desidera registrare.Dopo che è stato chiamato, tutte le modifiche apportate alla proprietà specificata chiamano OnAssociatedPropertyChanged() in entrambe le forme che verificano l'elemento del modello della proprietà.
Non è necessario chiamare AssociateValueWith() per ogni istanza.Sebbene InitializeResources è un metodo di istanza, viene richiamato solo una volta per ogni classe della forma.