Personalizzazione di strumenti e della casella degli strumenti
È necessario definire gli elementi della casella degli strumenti per gli elementi che si desidera consentire agli utenti di aggiungere i rispettivi modelli.Esistono due tipi di strumenti: strumenti dell'elemento e strumenti di connessione.Nella finestra di progettazione generata, un utente può selezionare uno strumento dell'elemento per trascinare le forme del diagramma e può selezionare uno strumento della connessione ai collegamenti di spostamento tra le forme.Gli strumenti dell'elemento let in genere gli utenti di aggiungere le istanze delle classi di dominio i rispettivi modelli e gli strumenti per la connessione li hanno ancora aggiungere le istanze delle relazioni di dominio.
In questo argomento:
Modificare le schede della casella degli strumenti
Strumenti dell'elemento
Creare gruppi di elementi da uno strumento
Strumenti di connessione
Modificare l'ordine degli elementi della casella degli strumenti
Come la casella degli strumenti è definita
Nel modello DSL Esplora Soluzioni, espandere il nodo dell'editor e i nodi.In genere visualizzata una gerarchia simile alla seguente:
Editor
Toobox Tabs
MyDsl //a tab
Tools
ExampleElement // an element tool
ExampleRelationship // a connection tool
In questa parte DSL Esplora Risorse, è possibile:
Creare nuove schede.Le schede definiscono le intestazioni della sezione della casella degli strumenti.
Creare nuovi strumenti.
Strumenti di copia e incolla.
Strumenti di spostamento verso l'alto o verso il basso nell'elenco.
Schede e strumenti di eliminazione.
![]() |
---|
Per aggiungere o incollare elementi in un modello DSL Esplora Soluzioni, fare clic con il pulsante destro del mouse sul padre del nuovo nodo.Ad esempio, per aggiungere uno strumento, fare clic con il pulsante destro del mouse sulla scheda e non strumenti nodo.Per aggiungere una scheda, fare clic con il pulsante destro del mouse editor nodo. |
L'icona casella degli strumenti la proprietà di ogni strumento fa riferimento a un file bitmap di 16x16.Questi file in genere vengono conservati in Dsl\Resources cartella.
classe la proprietà di uno strumento dell'elemento fa riferimento a una classe di dominio concreta.Per impostazione predefinita, lo strumento creerà istanze di questa classe.Tuttavia, è possibile scrivere codice per far creare lo strumento gruppi di elementi, o elementi di tipi diversi.
Generatore di connessione la proprietà di uno strumento di connessione fa riferimento a un generatore di connessione, che definisce il tipo elementi lo strumento possibile connettersi e che crea relazioni tra essi.I generatori di connessione sono definiti come nodi nel modello DSL Esplora Risorse.I generatori di connessione vengono creati automaticamente quando si definiscono relazioni di dominio, ma è possibile scrivere codice per personalizzarli.
Per aggiungere uno strumento nella casella degli strumenti
Generalmente si crea uno strumento dell'elemento dopo avere creato una classe di forma e la quale è stato eseguito il mapping a una classe di dominio.
Generalmente si crea uno strumento del connettore dopo avere creato una classe del connettore e la quale è stato eseguito il mapping a una relazione di riferimento.
Nel modello DSL Esplora Soluzioni, espandere editor nodo e Schede della casella degli strumenti nodo.
Fare clic con il pulsante destro del mouse su un nodo della scheda della casella degli strumenti e fare clic su Aggiungere il nuovo strumento dell'elemento o Aggiungere il nuovo strumento di connessione.
impostare L'icona casella degli strumenti proprietà per fare riferimento a una bitmap di 16x16.
Se si desidera definire una nuova icona, creare un file bitmap in Esplora soluzioni in Dsl\Resources cartella.Il file deve disporre dei seguenti valori delle proprietà: operazione di compilazione = contenuto; Copia nella directory di output = non copiare.
Per uno strumento dell'elemento: impostare classe proprietà dello strumento per fare riferimento a una classe di dominio concreta mappata alla forma.
Per uno strumento del connettore: impostare Generatore di connessione proprietà dello strumento su uno degli elementi che sono in lettere nell'elenco a discesa.I generatori di connessione vengono creati automaticamente quando si esegue il mapping di un connettore di una relazione di dominio.Se recentemente è stato creato un connettore, in genere si selezionerà il generatore associato alla connessione.
Per testare il modello DSL, premere F5 o CTRL+F5 il e nell'istanza sperimentale di Visual Studio, aprire un file di modello di esempio.Il nuovo strumento deve essere visualizzato nella casella degli strumenti.Trascinarla nel diagramma per verificare che crei un nuovo elemento.
Se lo strumento non viene visualizzato, interrompere lo sperimentale Visual Studio.Nelle finestre inizio menu, esecuzione Reimpostare istanza sperimentale di Microsoft Visual Studio 2010.In Visual StudioCompilazione menu, fare clic su Soluzione di ricompilazione.Quindi eseguire nuovamente il modello DSL.
Personalizzare gli strumenti dell'elemento
Per impostazione predefinita, lo strumento creerà una singola istanza della classe specificata, ma è possibile variare in due modi:
Definire le direttive di unione dell'elemento su altre classi, abilitandole per accettare le nuove istanze di questa classe e abilitandole per creare collegamenti aggiuntivi quando il nuovo elemento viene creato.Ad esempio, è possibile consentire che l'utente rilascia un commento a un altro elemento e quindi creato un collegamento di riferimento tra i due.
Queste personalizzazioni influiscono su ciò che si verifica quando l'utente incolla o trascina e rilascia un elemento.
Per ulteriori informazioni, vedere Personalizzazione della creazione e dello spostamento di elementi.
Scrivere il codice per personalizzare lo strumento in modo da poter creare gruppi di elementi.Lo strumento viene inizializzato con i metodi in ToolboxHelper.cs che è possibile eseguire l'override.Per ulteriori informazioni, vedere Creare gruppi di elementi da uno strumento.
Creare gruppi di elementi da uno strumento
Ogni strumento dell'elemento contiene un prototipo degli elementi che si desidera creare.Per impostazione predefinita, ogni strumento dell'elemento crea un singolo elemento, ma è anche possibile creare un gruppo di oggetti correlati a uno strumento.A tale scopo, inizializzare lo strumento con ElementGroupPrototype che contiene gli elementi correlati.
L'esempio seguente è preso da un linguaggio specifico di dominio in cui esista un transistor del tipo.Ogni transistor dispone di tre denominati Terminals.Lo strumento dell'elemento per i transistor archivia un prototipo che contiene quattro elementi del modello e tre plug-in della relazione.Quando l'utente trascina lo strumento nel diagramma, il prototipo viene creata un'istanza e collegato alla radice del modello.
Questo codice esegue l'override di un metodo definito in Dsl\GeneratedCode\ToolboxHelper.cs.
Per ulteriori informazioni sulla personalizzazione del modello utilizzando il codice del programma, vedere Esplorazione e aggiornamento di un modello nel codice del programma.
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
public partial class CircuitsToolboxHelper
{
/// <summary>
/// Toolbox initialization, called for each element tool on the toolbox.
/// This version deals with each Component subtype separately.
/// </summary>
/// <param name="store"></param>
/// <param name="domainClassId">Identifies the domain class this tool should instantiate.</param>
/// <returns>prototype of the object or group of objects to be created by tool</returns>
protected override ElementGroupPrototype CreateElementToolPrototype(Store store, Guid domainClassId)
{
if (domainClassId == Transistor.DomainClassId)
{
Transistor transistor = new Transistor(store);
transistor.Base = new ComponentTerminal(store);
transistor.Collector = new ComponentTerminal(store);
transistor.Emitter = new ComponentTerminal(store);
transistor.Base.Name = "base";
transistor.Collector.Name = "collector";
transistor.Emitter.Name = "emitter";
// Create an ElementGroup for the Toolbox.
ElementGroup elementGroup = new ElementGroup(store.DefaultPartition);
elementGroup.AddGraph(transistor, true);
// AddGraph includes the embedded parts
return elementGroup.CreatePrototype();
}
else
{
return base.CreateElementToolPrototype(store, domainClassId);
} } }
Personalizzare gli strumenti di connessione
In genere, si crea uno strumento dell'elemento quando si crea una nuova classe del connettore.In alternativa, è possibile eseguire l'overload di uno strumento in modo che i tipi delle due estremità di determinare il tipo della relazione.Ad esempio, è possibile definire uno strumento di connessione che potrebbe creare sia le relazioni di Persona-Persona che le relazioni di Persona-Città.
Generatori della connessione di chiamata degli strumenti di connessione.Utilizzare i generatori di connessione per specificare quali gli utenti possono caricare gli elementi di collegamento nella finestra di progettazione generata un'eccezione.I generatori di connessione specificano gli elementi che possono essere collegati e il tipo di collegamento che viene creato tra loro.
Quando si crea una relazione di riferimento tra le classi di dominio, un generatore di connessione viene creato automaticamente.È possibile utilizzare il generatore di connessione quando si esegue il mapping di uno strumento della connessione.Per ulteriori informazioni su come creare strumenti di connessione, vedere Personalizzazione di strumenti e della casella degli strumenti.
È possibile modificare il generatore predefinito di connessione in modo da poter gestire un insieme diverso del database di origine e i tipi di destinazione e creare tipi diversi di relazioni.
È inoltre possibile scrivere codice personalizzato per i generatori di connessione specificare le classi di origine e di destinazione per la connessione, per definire il tipo di connessione da eseguire e per eseguire altre operazioni associate alla creazione di una connessione.
La struttura dei generatori di connessione
I generatori di connessione sono inclusi uno o più collegamenti connettono le direttive, che specificano la relazione di dominio e gli elementi di origine e di destinazione.Ad esempio, in un modello di soluzione flusso di attività, è possibile vedere il CommentReferencesSubjectsBuilder in DSL Esplora Risorse.Questo generatore di connessione contiene un collegamento connette la direttiva denominata CommentReferencesSubjects, che viene eseguito il mapping in relazione di dominio CommentReferencesSubjects.questo collegamento connette la direttiva contiene un ruolo di origine di direttiva che indica Comment classe di dominio e un ruolo di destinazione di direttiva che indica FlowElement classe di dominio.
Utilizzando i generatori di connessione per limitare database di origine e i ruoli di destinazione
È possibile utilizzare i generatori di connessione per limitare l'occorrenza di alcune classi nel ruolo di origine o nel ruolo di destinazione di una relazione di dominio specificato.Ad esempio, è possibile avere una classe di dominio di base che ha una relazione di dominio in un'altra classe di dominio, ma non è possibile tutte le classi derivate dalla classe base per contenere gli stessi ruoli in tale relazione.Nella soluzione flusso di attività, vi sono quattro classi di dominio concrete (StartPoint, endpoint, MergeBranch e sincronizzazione) che eredita direttamente dall'elemento del flusso astratto classi di dominio e due classi di dominio concrete (attività e ObjectInState) che ereditano indirettamente da.C'è anche una relazione di riferimento del flusso che accetta le classi di dominio di elemento del flusso sia nel relativo ruolo di origine che il ruolo di destinazione.Tuttavia, un'istanza di una classe di dominio dell'endpoint non deve essere l'origine di un'istanza di una relazione di flusso, né necessario un'istanza di una classe di StartPoint essere il database di destinazione un'istanza di una relazione di flusso.Il generatore di connessione di FlowBuilder fa connettere un collegamento il flusso denominato direttiva che specifica quali classi di dominio possono svolgere il ruolo di origine (attività, MergeBranch, StartPoint e sincronizzazione) e quali può fornire il ruolo di destinazione (MergeBranch, endpoint e sincronizzazione).
I generatori di connessione con il collegamento più connettono le direttive
È possibile aggiungere più di un collegamento connette la direttiva in un generatore di connessione.Ciò consente di nascondere alcune complessità del modello di dominio dagli utenti e di mantenere Casella degli strumenti da ottenere ugualmente risulta di.È possibile aggiungere il collegamento per connettere le direttive per diverse relazioni di dominio a un unico generatore di connessione.Tuttavia, è necessario combinare le relazioni di dominio quando eseguono approssimativamente la stessa funzione.
Nella soluzione flusso di attività, lo strumento di connessione del flusso viene utilizzato per disegnare le istanze di flusso che le relazioni di dominio di ObjectFlow.Il generatore di connessione di FlowBuilder dispone, oltre al collegamento di flusso connesso alla direttiva riportata in precedenza, due che il collegamento connettere le direttive denominate ObjectFlow.Queste direttive specificano che un'istanza di una relazione di ObjectFlow può essere creata tra le istanze della classe di dominio di ObjectInState, o da un'istanza di un ObjectInState a un'istanza di un'attività, ma non tra due istanze di un'attività, o da un'istanza di un'attività a un'istanza di un ObjectInState.Tuttavia, un'istanza di una relazione di flusso può essere creata tra due istanze di un'attività.Se si compila e si esegue la soluzione flusso di attività, è possibile vedere che tracciando un flusso da un'istanza di un ObjectInState a un'istanza di un'attività crea un'istanza di un ObjectFlow, ma creando un flusso tra due istanze di un'attività crea un'istanza di un flusso.
Codice personalizzato per i generatori di connessione
Esistono quattro caselle di controllo nell'interfaccia utente che definiscono tipi diversi di personalizzazioni di generatori di connessione:
L'oggetto personalizzato accetta casella di controllo in un database di origine o al ruolo di destinazione di direttiva
L'oggetto personalizzato si connette casella di controllo in un database di origine o al ruolo di destinazione di direttiva
L'oggetto personalizzato di utilizzo si connette casella di controllo in una direttiva di connessione
Viene personalizzato proprietà generatore di connessione
È necessario fornire il codice programma per eseguire queste operazioni di personalizzazione.Per individuare il codice che è necessario fornire, controllare una di queste caselle, fare clic sulla trasformazione tutti i modelli e quindi compilare la soluzione.Una segnalazione errori contrario.Fare doppio clic sulla segnalazione errori per visualizzare un commento che viene illustrato il codice è necessario aggiungerlo.
[!NOTA]
Per aggiungere codice personalizzato, creare una definizione di classe parziale in un file di codice separati dai file di codice nella cartella GeneratedCode.Per evitare che il lavoro, non è necessario modificare i file di codice generati.Per ulteriori informazioni, vedere Override ed estensione delle classi generate.
Creare codice personalizzato di connessione
in ogni collegamento connettere la direttiva, ruolo di origine di direttive la scheda viene definito dai tipi è possibile trascinare.Analogamente, ruolo di destinazione di direttive la scheda definisce a quali tipi è possibile trascinare.Per ciascun tipo, è possibile specificare se consentire la connessione (per il collegamento connettere la direttiva impostando) L'oggetto personalizzato accetta flag e quindi fornire codice aggiuntivo.
È inoltre possibile personalizzare ciò che si verifica quando la connessione è stata eseguita.Ad esempio, è possibile personalizzare il caso in cui il trascinamento si verifica a o da una determinata classe, tutti i casi in cui un collegamento connette la direttiva regole, o l'intero generatore di connessione di FlowBuilder.Per ognuna di queste opzioni, è possibile impostare i flag personalizzati al livello appropriato.Quando si trasforma tutti i modelli e si tenta di compilare la soluzione, i messaggi di errore per rivolte ai commenti presenti nel codice generato.Questi commenti identificano le operazioni che è necessario fornire.
Nell'esempio di diagramma dei componenti, quello di connessione per il rapporto di dominio della connessione viene personalizzato limitare le connessioni che possono essere effettuate tra le porte.Nella figura seguente viene illustrato che è possibile eseguire connessioni solo da OutPort elementi a InPort gli elementi, ma è possibile annidare i componenti tra loro.
Connessione che passa a un OutPort da un componente annidato
Di conseguenza, è possibile specificare che una connessione può provenire da un componente annidato in un OutPort.Per specificare tale connessione, impostare L'oggetto personalizzato viene utilizzata accetta in InPort tipo come ruolo di origine e OutPort tipo come ruolo di destinazione in Dettagli DSL finestra come mostrato nelle illustrazioni seguenti:
Il collegamento connette la direttiva nel modello DSL Esplora Risorse
Il collegamento connette la direttiva nella finestra dettagli DSL
È quindi necessario fornire i metodi della classe di ConnectionBuilder:
public partial class ConnectionBuilder
{
/// <summary>
/// OK if this component has children
/// </summary>
private static bool CanAcceptInPortAsSource(InPort candidate)
{
return candidate.Component.Children.Count > 0;
}
/// <summary>
/// Only if source is on parent of target.
/// </summary>
private static bool CanAcceptInPortAndInPortAsSourceAndTarget (InPort sourceInPort, InPort targetInPort)
{
return sourceInPort.Component == targetInPort.Component.Parent;
}
// And similar for OutPorts…
Per ulteriori informazioni sulla personalizzazione del modello utilizzando il codice del programma, vedere Esplorazione e aggiornamento di un modello nel codice del programma.
È possibile utilizzare codice analogo, ad esempio, impedire agli utenti di creare cicli con collegamenti padre-figlio.Queste limitazioni sono considerate vincoli “difficile„ perché gli utenti non possono violarli in qualsiasi momento.È anche possibile creare controlli di convalida “di software„ che gli utenti possono ignorare temporaneamente la creazione di configurazioni non valide che non possono salvare.
Procedura consigliata nella definizione di generatori di connessione
È necessario definire un generatore di connessione per creare tipi diversi di relazioni solo se sono correlati a livello concettuale.Nell'esempio del flusso di attività, utilizzare lo stesso generatore per creare i flussi tra attività e anche tra attività e oggetti.Tuttavia, è preferibile utilizzare lo stesso generatore per creare relazioni tra i commenti e attività.
Se si definisce un generatore di connessione per più tipi di relazioni, è necessario assicurarsi che potrebbe non corrispondere più di un tipo dalla stessa coppia del database di origine e degli oggetti di destinazione.In caso contrario, i risultati saranno imprevisti.
Utilizzare codice personalizzato per applicare vincoli “difficile„, ma è necessario considerare se gli utenti devono essere temporaneamente eseguire connessioni non valide.Se, è possibile modificare i vincoli in modo da non convalidare le connessioni fino agli utenti non tentino di salvare le modifiche.
Vedere anche
Concetti
Personalizzazione della creazione e dello spostamento di elementi
Personalizzazione del comportamento di copia
Procedura: aggiungere un gestore di trascinamento della selezione
Esplorazione e aggiornamento di un modello nel codice del programma