Partager via


Comment : accéder à et contraindre la sélection actuelle

Lorsque vous entrez une commande ou un gestionnaire de mouvements pour votre langage spécifique au domaine, vous pouvez déterminer quel élément l'utilisateur a cliqué avec le bouton droit. Vous pouvez également empêcher des formes ou des champs d'être sélectionné. Par exemple, vous pouvez réorganiser que lorsque l'utilisateur clique sur un élément décoratif d'icône, la forme qui le contient est sélectionnée à la place. Contraignant la sélection réduit de cette manière le nombre de gestionnaires à écrire. Elle permet également à l'utilisateur, qui peut cliquer n'importe où dans la forme sans devoir éviter de décorateur.

Accès à la sélection actuelle d'un gestionnaire de commandes

La classe de jeu de commandes d'un langage spécifique au domaine contient les gestionnaires de commandes pour vos commandes personnalisées. La classe d' CommandSet , de la classe de jeu de commandes d'un langage spécifique au domaine dérive de, fournit des membres pour accéder à la sélection actuelle.

Selon la commande, le gestionnaire de commandes peut avoir besoin de la sélection dans le générateur de modèles, l'explorateur de modèles, ou la fenêtre active.

Les informations de sélection d'accès

  1. la classe d' CommandSet définit les membres suivants qui peuvent être utilisés pour accéder à la sélection actuelle.

    Membre

    Description

    Méthode IsAnyDocumentSelectionCompartment

    Retourne true si l'un des éléments sélectionnés dans le concepteur de modèles est une forme de compartiment ; sinon, false.

    Méthode IsDiagramSelected

    Retourne true si le diagramme est sélectionné dans le concepteur de modèles ; sinon, false.

    Méthode IsSingleDocumentSelection

    Retourne true si exactement un élément est sélectionné dans le concepteur de modèles ; sinon, false.

    Méthode IsSingleSelection

    Retourne true si exactement un élément est sélectionné dans la fenêtre active ; sinon, false.

    Propriété CurrentDocumentSelection

    Obtient une collection en lecture seule des éléments sélectionnés dans le concepteur de modèles.

    Propriété CurrentSelection

    obtient une collection en lecture seule des éléments sélectionnés dans la fenêtre active.

    Propriété SingleDocumentSelection

    Obtient l'élément principal de la sélection dans le générateur de modèles.

    Propriété SingleSelection

    Obtient l'élément principal de la sélection dans la fenêtre active.

  2. La propriété d' CurrentDocView de la classe d' CommandSet permet d'accéder à l'objet d' DiagramDocView qui représente la fenêtre de générateur de modèles et fournit l'accès supplémentaire les éléments sélectionnés dans le concepteur de modèles.

  3. En outre, le code généré définit une propriété de la fenêtre Outil explorateur et une propriété de sélection de l'explorateur dans la classe de jeu de commandes pour le langage spécifique au domaine.

    • La propriété de la fenêtre Outil de l'explorateur retourne une instance de la classe de fenêtre Outil de l'explorateur pour le langage spécifique au domaine. La classe de fenêtre Outil de l'explorateur dérive de la classe d' ModelExplorerToolWindow et représente l'explorateur de modèles pour le langage spécifique au domaine.

    • La propriété d' [ExplorerSelection] retourne l'élément sélectionné dans la fenêtre de modèle de l'explorateur pour le langage spécifique au domaine.

Déterminer quelle fenêtre est active

l'interface d' IMonitorSelectionService contient définit les membres qui permettent d'accéder à l'état de sélection actuel dans le shell. Vous pouvez obtenir un objet d' IMonitorSelectionService de la classe du package ou de la classe de jeu de commandes pour le langage spécifique au domaine via la propriété d' [MonitorSelection] définie dans la classe de base en matière. La classe du package dérive de la classe d' ModelingPackage , et la classe de jeu de commandes dérive de la classe d' CommandSet .

Pour déterminer d'un gestionnaire de commandes quel type de fenêtre est active

  1. La propriété d' MonitorSelection de la classe d' CommandSet retourne un objet d' IMonitorSelectionService qui permet d'accéder à l'état de sélection actuel dans le shell.

  2. la propriété d' CurrentSelectionContainer de l'interface d' IMonitorSelectionService obtient le conteneur de sélection active, qui peut être différent de la fenêtre active.

  3. Ajoutez les propriétés suivantes à la classe de jeu de commandes à votre langage spécifique au domaine pour déterminer le type de fenêtre est active.

    // using Microsoft.VisualStudio.Modeling.Shell;
    
    // Returns true if the model designer is the active selection container;
    // otherwise, false.
    protected bool IsDesignerActive
    {
        get
        {
            return (this.MonitorSelection.CurrentSelectionContainer
                is DiagramDocView);
        }
    }
    
    // Returns true if the model explorer is the active selection container;
    // otherwise, false.
    protected bool IsExplorerActive
    {
        get
        {
            return (this.MonitorSelection.CurrentSelectionContainer
                is ModelExplorerToolWindow);
        }
    }
    

contrainte de la sélection

En ajoutant des règles de sélection, vous pouvez contrôler les éléments sont sélectionnées lorsque l'utilisateur sélectionne un élément dans le modèle. Par exemple, pour permettre à l'utilisateur pour traiter un certain nombre d'éléments comme une seule unité, vous pouvez utiliser une règle de sélection.

pour créer une règle de sélection

  1. Créez un fichier de code dans le projet DÉSOLÉ

  2. définissez une classe de règle de sélection qui est dérivée de la classe d' DiagramSelectionRules .

  3. Substituez la méthode d' GetCompliantSelection de classe de règles de sélection pour appliquer des critères de sélection.

  4. ajoutez une définition de classe partielle pour la classe d' [ClassDiagram] à votre fichier de code personnalisé.

    La classe d' [ClassDiagram] dérive de la classe d' Diagram et est définie dans le fichier de code généré, Diagram.cs, dans le projet DÉSOLÉ.

  5. Substituez la propriété d' SelectionRules de la classe d' [ClassDiagram] pour retourner la règle de sélection personnalisée.

    l'implémentation par défaut de la propriété d' SelectionRules obtient un objet de règle de sélection qui ne modifie pas la sélection.

Exemple

Le fichier de code suivant crée une règle de sélection qui se développe la sélection pour inclure toutes les instances de chacune des formes de domaine qui a été initialement sélectionné.

using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;

namespace CompanyName.ProductName.GroupingDsl
{
    public class CustomSelectionRules : DiagramSelectionRules
    {
        protected Diagram diagram;
        protected IElementDirectory elementDirectory;

        public CustomSelectionRules(Diagram diagram)
        {
            if (diagram == null) throw new ArgumentNullException();

            this.diagram = diagram;
            this.elementDirectory = diagram.Store.ElementDirectory;
        }

        /// <summary>Called by the design surface to allow selection filtering.
        /// </summary>
        /// <param name="currentSelection">[in] The current selection before any
        /// ShapeElements are added or removed.</param>
        /// <param name="proposedItemsToAdd">[in/out] The proposed DiagramItems to
        /// be added to the selection.</param>
        /// <param name="proposedItemsToRemove">[in/out] The proposed DiagramItems
        /// to be removed from the selection.</param>
        /// <param name="primaryItem">[in/out] The proposed DiagramItem to become
        /// the primary DiagramItem of the selection. A null value signifies that
        /// the last DiagramItem in the resultant selection should be assumed as
        /// the primary DiagramItem.</param>
        /// <returns>true if some or all of the selection was accepted; false if
        /// the entire selection proposal was rejected. If false, appropriate
        /// feedback will be given to the user to indicate that the selection was
        /// rejected.</returns>
        public override bool GetCompliantSelection(
            SelectedShapesCollection currentSelection,
            DiagramItemCollection proposedItemsToAdd,
            DiagramItemCollection proposedItemsToRemove,
            DiagramItem primaryItem)
        {
            if (currentSelection.Count == 0 && proposedItemsToAdd.Count == 0) return true;

            HashSet<DomainClassInfo> itemsToAdd = new HashSet<DomainClassInfo>();

            foreach (DiagramItem item in proposedItemsToAdd)
            {
                if (item.Shape != null)
                    itemsToAdd.Add(item.Shape.GetDomainClass());
            }
            proposedItemsToAdd.Clear();
            foreach (DomainClassInfo classInfo in itemsToAdd)
            {
                foreach (ModelElement element
                    in this.elementDirectory.FindElements(classInfo, false))
                {
                    if (element is ShapeElement)
                    {
                        proposedItemsToAdd.Add(
                            new DiagramItem((ShapeElement)element));
                    }
                }
            }

            return true;
        }
    }

    public partial class ClassDiagram
    {
        protected CustomSelectionRules customSelectionRules = null;

        protected bool multipleSelectionMode = true;

        public override DiagramSelectionRules SelectionRules
        {
            get
            {
                if (multipleSelectionMode)
                {
                    if (customSelectionRules == null)
                    {
                        customSelectionRules = new CustomSelectionRules(this);
                    }
                    return customSelectionRules;
                }
                else
                {
                    return base.SelectionRules;
                }
            }
        }
    }
}

Voir aussi

Référence

CommandSet

ModelingPackage

DiagramDocView

ModelExplorerToolWindow

IMonitorSelectionService

DiagramSelectionRules

Diagram