Personnalisation des outils et de la boîte à outils
Vous devez définir des éléments de boîte à outils pour les éléments que vous souhaitez permettre aux utilisateurs d'ajouter à leurs modèles.Il existe deux genres d'outils : outils d'élément et outils de connexion.Dans le concepteur généré, un utilisateur peut sélectionner un outil d'élément pour faire glisser des formes au diagramme, et peut sélectionner un outil de connexion aux liens de dessin entre les formes.En général les outils d'élément permettent aux utilisateurs d'ajouter des instances de classes de domaine à leurs modèles, et les outils de connexion se sont laissés ajouter des instances des relations de domaine.
Dans cette rubrique :
Modifier les Onglets de la boîte à outils
outils d'élément
créer des groupes d'éléments d'un outil
outils de connexion
Modifier l'ordre des éléments de boîte à outils
comment la boîte à outils est définie
Dans l'explorateur DÉSOLÉ, développez le nœud d'éditeur et les nœuds figurant au-dessous.en général vous verrez une hiérarchie qui ressemble à ceci :
Editor
Toobox Tabs
MyDsl //a tab
Tools
ExampleElement // an element tool
ExampleRelationship // a connection tool
Dans cette partie de l'explorateur DÉSOLÉ, vous pouvez :
Créez de nouveaux onglets.les Onglets définissent les titres de section dans la boîte à outils.
créez les nouveaux outils.
outils de copie et de collage.
Outils de déplacement vers le haut ou le bas de la liste.
onglets et outils de suppression.
Important
Pour ajouter ou coller des éléments dans un explorateur DÉSOLÉ, cliquez avec le bouton droit sur le grand-parent du nouveau nœud.Par exemple, pour ajouter un outil, cliquez avec le bouton droit sur l'onglet, et non le nœud d' Outils .Pour ajouter un onglet, cliquez avec le bouton droit sur le nœud d' Éditeur .
la propriété d' icône de boîte à outils de chaque outil référence un fichier bitmap 16x16.Ces fichiers sont généralement conservés dans le dossier d' Dsl\Resources .
La propriété de Classe d'un outil d'élément fait référence à une classe concrète de domaine.Par défaut, l'outil crée des instances de cette classe.Toutefois, vous pouvez écrire du code pour créer l'outil des groupes d'éléments, ou d'éléments de différents types.
La propriété de Concepteur de connexion d'un outil de connexion fait référence à un concepteur de connexion, qui définit les types d'éléments l'outil peut connecter, et les relations il crée entre eux.Les générateurs de connexion sont définis comme des nœuds dans l'explorateur DÉSOLÉ.Les générateurs de connexion sont créés automatiquement lorsque vous définissez des relations de domaine, mais vous pouvez écrire du code pour les personnaliser.
pour ajouter un outil à la boîte à outils
Vous créez généralement un outil d'élément après avoir créé une classe de forme et que vous l'avez mappée à une classe de domaine.
Vous créez généralement un outil de connecteur après avoir créé une classe de connecteur et que vous l'avez mappée à une relation de référence.
Dans l'explorateur DÉSOLÉ, développez le nœud d' Éditeur et le nœud d' Onglets de la boîte à outils .
Cliquez avec le bouton droit sur un nœud d'onglet de boîte à outils, puis cliquez sur ajoutez le nouvel outil d'élément ou ajoutez le nouvel outil de connexion.
Définissez la propriété d' icône de boîte à outils pour faire référence à une bitmap 16x16.
Si vous souhaitez définir une nouvelle icône, créez un fichier de commandes bitmap en solution dans le dossier d' Dsl\Resources .Le fichier doit avoir les valeurs de propriété suivantes : Action de génération = Contenu; Copier dans le répertoire de sortie = Ne pas copier.
pour un outil d'élément : Définissez la propriété de Classe de l'outil pour faire référence à une classe concrète de domaine qui est mappée à une forme.
pour un outil de connecteur : Définissez la propriété de Concepteur de connexion de l'outil à l'un des éléments proposés dans la liste déroulante.Les générateurs de connexion sont créés automatiquement lorsque vous mappez un connecteur vers une relation de domaine.Si vous avez récemment créé un connecteur, vous sélectionnez normalement le concepteur associé de connexion.
Pour tester le DÉSOLÉ, appuyez sur F5 ou CTRL+F5 les, et dans l'instance expérimentale de Visual Studio, ouvrez un fichier d'exemple de modèle.Le nouvel outil doit s'afficher dans la boîte à outils.Faites -la glisser vers le diagramme pour vérifier qu'il crée un nouvel élément.
Si l'outil ne s'affiche pas, arrêtez Visual Studioexpérimental.Dans le menu de Démarrer windows, exécutez réinitialisez l'instance expérimentale de Microsoft Visual Studio 2010.Dans le menu de Visual StudioGénérer , cliquez sur Régénérer la solution.Testez ensuite le DÉSOLÉ de nouveau.
personnaliser des outils d'élément
Par défaut, l'outil crée une instance unique de la classe spécifiée, mais vous pouvez varier faire de deux façons :
Définissez les directives de fusion d'élément supérieure sur d'autres classes, en les archivant pour recevoir de nouvelles instances de cette classe, et en les archivant pour créer des liens supplémentaires lorsque le nouvel élément est créé.Par exemple, vous pourriez permettre à l'utilisateur pour supprimer un commentaire sur un autre élément, et créer ainsi un lien de référence entre les deux.
Ces personnalisations affectent également ce qui se produit lorsque l'utilisateur a placées ou en les faisant glisser un élément.
Pour plus d'informations, consultez Personnalisation de la création et du mouvement des éléments.
Écrivez du code pour personnaliser l'outil afin qu'il puisse créer des groupes d'éléments.L'outil est initialisé par les méthodes dans ToolboxHelper.cs que vous pouvez substituer.Pour plus d'informations, consultez créer des groupes d'éléments d'un outil.
créer des groupes d'éléments d'un outil
Chaque outil d'élément contient un prototype des éléments qu'il doit créer.Par défaut, chaque outil d'élément crée un élément unique, mais il est également possible de créer un groupe d'objets liés à un outil.Pour ce faire, vous initialisez l'outil avec ElementGroupPrototype qui contient les éléments connexes.
L'exemple suivant est extrait d'un langage spécifique à un domaine dans lequel il existe un transistor de type.chaque transistor a trois nommés Terminals.L'outil d'élément pour les transistors enregistre un prototype contenant quatre éléments de modèle et trois liens de relation.Lorsque l'utilisateur fait glisser l'outil vers le diagramme, le prototype est instancié et lié à la racine modèle.
Ce code substitue une méthode définie dans Dsl\GeneratedCode\ToolboxHelper.cs.
Pour plus d'informations sur la personnalisation du modèle à l'aide de le code de programme, consultez Navigation et mise à jour d'un modèle dans le code de programme.
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);
} } }
Personnaliser les outils de connexion
Généralement, vous créez un outil d'élément lorsque vous créez une nouvelle classe de connecteur.Sinon, vous pouvez surcharger un outil en permettant aux types des deux extrémités pour déterminer le type de la relation.Par exemple, vous pouvez définir un outil de connexion qui peut créer des relations de Personne-Personne et des relations de Personne-Ville.
les outils de connexion appellent des générateurs de connexion.Générateurs de connexion à utiliser pour spécifier comment les utilisateurs peuvent référencer des éléments de lien dans le concepteur généré.Les générateurs de connexion spécifient les éléments qui peuvent être liés et le type de lien qui est créé entre eux.
Lorsque vous créez une relation de référence entre les classes de domaine, un générateur de connexion est créé automatiquement.Vous pouvez utiliser ce concepteur de connexion lorsque vous mappez un outil de connexion.Pour plus d'informations sur la création des outils de connexion, consultez Personnalisation des outils et de la boîte à outils.
Vous pouvez modifier le générateur par défaut de connexion afin qu'il puisse traiter une plage différente de source et de types cibles, et créer différents types de relations.
Vous pouvez également écrire du code personnalisé pour les concepteurs de connexion spécifient les classes de source et cible pour la connexion, de définir le type de connexion à effectuer, et d'exécuter d'autres actions associées à la création d'une connexion.
la structure des générateurs de connexion
Les générateurs de connexion contiennent un ou plusieurs liens connectent les directives, qui spécifient la relation de domaine et les éléments de source et cible.Par exemple, dans le modèle de solution de flux de travail, vous pouvez consulter le CommentReferencesSubjectsBuilder dans Explorateur DÉSOLÉ.Ce concepteur de connexion contient un lien connectent CommentReferencesSubjectsnommé par directive, qui est mappée à la relation CommentReferencesSubjects de domaine.Ce lien connectent la directive contient un rôle de directive de source qui indique la classe de domaine d' Comment , et un rôle cible de directive qui pointe vers la classe de domaine d' FlowElement .
Utilisation des concepteurs de connexion pour restreindre les rôles de source et cible
Vous pouvez utiliser des générateurs de connexion pour restreindre l'occurrence de certaines classes dans le rôle de source ou le rôle cible d'une relation données de domaine.Par exemple, vous pouvez avoir une classe de base de domaine qui a une relation de domaine à une autre classe de domaine, mais vous pouvez souhaiter que toutes les classes dérivées de la classe de base pour contenir les mêmes rôles dans cette relation.Dans la solution de flux de travail, il existe quatre classes concrètes de domaine (StartPoint, point de terminaison, MergeBranch, et de synchronisation) qui héritent directement depuis l'élément de flux abstrait de classe de domaine, et deux classes concrètes de domaine (tâche et ObjectInState) qui le biais de lui.Il existe également une relation de référence de flux qui prend des classes de domaine d'élément de flux dans son rôle de source et rôle de cible.Est-ce-que toutefois, une instance d'une classe de domaine de point de terminaison ne doit pas être la source de l'instance d'une relation de flux, ni doit une instance d'une classe de StartPoint être la cible d'une instance d'une relation de flux.Le concepteur de connexion de FlowBuilder fait connecter un lien le flux nommé par directive qui spécifie que les classes de domaine peuvent jouer le rôle de source (tâche, MergeBranch, StartPoint, et la synchronisation) et qui peut jouer le rôle cible (MergeBranch, point de terminaison, et la synchronisation).
Les générateurs de connexion avec plusieurs lien connectent des directives
Vous pouvez ajouter plusieurs lien connectez la directive à un concepteur de connexion.Cela peut vous aider à masquer certaines complexités du modèle de domaine des utilisateurs et à conserver boîte à outils de l'obtention trop de disposer.Vous pouvez ajouter le lien associez des directives pour plusieurs relations de domaine à un concepteur unique de connexion.Toutefois, vous devez combiner des relations de domaine lorsqu'ils remplissent environ la même fonction.
dans la solution de flux de tâche, l'outil de connexion de flux est utilisé pour dessiner des instances du flux et des relations de domaine d'ObjectFlow.Le concepteur de connexion de FlowBuilder un, en plus de le lien de flux connectent la directive décrit précédemment, deux que le lien connectent des directives nommées ObjectFlow.Ces directives spécifier qu'une instance d'une relation d'ObjectFlow peut être dessinée entre des instances de la classe de domaine d'ObjectInState, ou d'une instance d'un ObjectInState à une instance d'une tâche, mais pas entre deux instances d'une tâche, ou d'une instance d'une tâche à une instance d'un ObjectInState.Toutefois, une instance d'une relation de flux peut être dessinée entre deux instances d'une tâche.Si vous compilez et exécutez la solution de flux de travail, vous pouvez voir que dessinant un flux d'une instance d'un ObjectInState à une instance d'une tâche crée une instance d'un ObjectFlow, mais dessinant un flux entre deux instances d'une tâche crée une instance d'un flux.
Le code personnalisé pour les générateurs de connexion
Il existe quatre cases à cocher de l'interface utilisateur qui définissent différents types de personnalisation des générateurs de connexion :
la case à cocher de Le personnalisé acceptent sur un rôle de directive de source ou de cible
la case à cocher d' Une personnalisée se connectent sur un rôle de directive de source ou de cible
la case à cocher de Le personnalisé en charge se connectent sur une directive de connexion
la propriété d' est personnalisé de connexion
Vous devez fournir du code de programme pour que ces personnalisations.Pour connaître le code vous devez fournir, vérifiez une de ces zones, cliquez sur la transformation tous les modèles, puis générez votre solution.Un rapport d'erreurs se produiront.Double-cliquez sur le rapport d'erreurs pour afficher un commentaire qui explique quel code vous devez ajouter.
[!REMARQUE]
Pour ajouter le code personnalisé, créez une définition de classe partielle dans un fichier de code distinct des fichiers de code dans les dossiers GeneratedCode.Pour éviter de perdre votre travail, vous ne devez pas modifier les fichiers de code générés.Pour plus d'informations, consultez Substitution et extension des classes générées.
Créer le code personnalisé de connexion
Dans chaque lien connectez la directive, l'onglet de rôle de directives de source définit de les types vous pouvez faire glisser.De même, l'onglet de rôle cible de directives définit sur les types vous pouvez faire glisser.Pour chaque type, vous pouvez spécifier davantage autoriser la connexion (pour ce lien connectez la directive) en définissant l'indicateur de Le personnalisé acceptent puis en fournissant le code supplémentaire.
Vous pouvez également personnaliser ce qui se produit lorsque le rapport est généré.Par exemple, vous pouvez personnaliser simplement le cas où se produit le glisser-déplacer vers ou d'une classe particulière, tous les cas où un lien connectent la directive régit, ou l'intégralité du concepteur de connexion de FlowBuilder.Pour chacune de ces options, vous pouvez définir les indicateurs personnalisées au niveau approprié.Lorsque vous transformez tous les modèles et essayez de générer la solution, les messages d'erreur vous dirigent aux commentaires qui sont dans le code généré.ces commentaires identifient ce que vous devez fournir.
Dans l'exemple de diagramme de composants, le concepteur de connexion pour la relation de domaine de connexion est personnalisé pour restreindre les rapports qui peuvent être établies entre les ports.L'illustration suivante montre que vous pouvez générer des rapports seuls les éléments de OutPort aux éléments d' InPort , mais vous pouvez imbriquer des composants à l'intérieur de l'un de l'autre.
connexion entrant à un OutPort d'un composant imbriqué
Par conséquent, vous pouvez spécifier qu'une connexion peut provenir d'un composant imbriqué à un OutPort.Pour spécifier une ces connexion, vous Le personnalisé en charge acceptent définis sur le type d' InPort comme rôle de source et le type d' OutPort comme rôle cible dans la fenêtre de Détails DÉSOLÉ comme indiqué dans les illustrations suivantes :
Le lien connectent la directive dans l'explorateur DÉSOLÉ
Le lien connectent la directive dans la fenêtre de détails DÉSOLÉ
Vous devez fournir ensuite des méthodes dans la classe de 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…
Pour plus d'informations sur la personnalisation du modèle à l'aide de le code de programme, consultez Navigation et mise à jour d'un modèle dans le code de programme.
Vous pouvez utiliser un code similaire, par exemple, empêcher les utilisateurs de créer boucle avec des liens parent-enfant.Ces restrictions sont considérées comme des contraintes « dures » parce que les utilisateurs ne peuvent pas de violer à tout moment.Vous pouvez également créer la validation « conditionnelle » vérifie que les utilisateurs peuvent ignorer temporairement en créant des configurations valides qu'ils ne peuvent pas enregistrer.
Conseillées en définissant des générateurs de connexion
Vous devez définir un générateur de connexion pour créer différents types de relations uniquement s'ils sont conceptuellement liés.Dans l'exemple de flux de travail, utilisez le même concepteur pour créer des flux entre les tâches et également entre les tâches et les objets.Toutefois, il serait simple d'utiliser le même concepteur pour créer des relations entre les commentaires et les tâches.
Si vous définissez un concepteur de connexion pour plusieurs types de relations, vous devez vérifier qu'il ne peut pas correspondre à plusieurs types des mêmes paires de source et d'objets cibles.Sinon, les résultats sont imprévisibles.
Vous utilisez du code personnalisé pour appliquer des contraintes « dures », mais vous devez déterminer si les utilisateurs doivent pouvoir générer temporairement des rapports valides.S'ils, vous pouvez modifier les contraintes afin que les connexions ne soient pas validées jusqu'à ce qu'utilisateurs tentent d'enregistrer les modifications.
Voir aussi
Concepts
Personnalisation de la création et du mouvement des éléments
Personnalisation du comportement de la commande copier
Comment : ajouter un gestionnaire glisser-déplacer
Navigation et mise à jour d'un modèle dans le code de programme