Sdílet prostřednictvím


Přístup k aktuálnímu výběru a jeho omezení

Při psaní příkazu nebo obslužné rutiny gest pro konkrétní jazyk domény můžete určit, na jaký prvek uživatel kliknul pravým tlačítkem myši. Můžete také zabránit výběru některých obrazců nebo polí. Můžete například uspořádat, že když uživatel klikne na dekorátor ikony, obrazec, který ho obsahuje, je vybrán. Omezení výběru tímto způsobem snižuje počet obslužných rutin, které musíte napsat. Také usnadňuje uživateli, který může kliknout kamkoli do obrazce, aniž by se musel vyhnout dekorátoru.

Přístup k aktuálnímu výběru z obslužné rutiny příkazu

Třída sady příkazů pro jazyk specifický pro doménu obsahuje obslužné rutiny příkazů pro vlastní příkazy. Třída CommandSet , ze které je odvozena třída sady příkazů pro jazyk specifický pro doménu, poskytuje několik členů pro přístup k aktuálnímu výběru.

V závislosti na příkazu může obslužná rutina příkazu potřebovat výběr v návrháři modelů, průzkumníku modelů nebo aktivním okně.

Přístup k informacím o výběru

  1. Třída CommandSet definuje následující členy, které lze použít pro přístup k aktuálnímu výběru.

    Člen Popis
    IsAnyDocumentSelectionCompartment Metoda Vrátítrue, pokud některý z prvků vybraných v návrháři modelu je obrazec prostoru; jinak . false
    IsDiagramSelected Metoda Vrátí true , pokud je diagram vybrán v návrháři modelů; v opačném případě false.
    IsSingleDocumentSelection Metoda Vrátí true , pokud je v návrháři modelu vybrán přesně jeden prvek; v opačném případě false.
    IsSingleSelection Metoda Vrátí true , pokud je v aktivním okně vybrán přesně jeden prvek; v opačném případě false.
    CurrentDocumentSelection Vlastnost Získá kolekci prvků vybraných v návrháři modelů jen pro čtení.
    CurrentSelection Vlastnost Získá kolekci prvků vybraných v aktivním okně jen pro čtení.
    SingleDocumentSelection Vlastnost Získá primární prvek výběru v návrháři modelu.
    SingleSelection Vlastnost Získá primární prvek výběru v aktivním okně.
  2. CurrentDocView Vlastnost CommandSet třídy poskytuje přístup k objektuDiagramDocView, který představuje okno návrháře modelu a poskytuje další přístup k vybraným prvkům v návrháři modelu.

  3. Kromě toho vygenerovaný kód definuje vlastnost okna nástroje průzkumníka a vlastnost výběru průzkumníka ve třídě sady příkazů pro jazyk specifický pro doménu.

    • Vlastnost okna nástroje průzkumníka vrátí instanci třídy okna nástroje průzkumníka pro jazyk specifický pro doménu. Třída okna nástroje průzkumníka je odvozena od ModelExplorerToolWindow třídy a představuje průzkumníka modelů pro jazyk specifický pro doménu.

    • Vlastnost ExplorerSelection vrátí vybraný prvek v okně Průzkumníka modelů pro jazyk specifický pro doménu.

Určení aktivního okna

Rozhraní IMonitorSelectionService obsahuje definuje členy, které poskytují přístup k aktuálnímu stavu výběru v prostředí. Objekt můžete získat IMonitorSelectionService z třídy balíčku nebo třídy sady příkazů pro jazyk specifický pro doménu prostřednictvím MonitorSelection vlastnosti definované v základní třídě každého. Třída balíčku je odvozena z ModelingPackage třídy a třída sady příkazů je odvozena z CommandSet třídy.

Určení typu okna z obslužné rutiny příkazu

  1. MonitorSelection Vlastnost CommandSet třídy vrátí IMonitorSelectionService objekt, který poskytuje přístup k aktuálnímu stavu výběru v prostředí.

  2. Vlastnost CurrentSelectionContainer IMonitorSelectionService rozhraní získá aktivní kontejner výběru, který se může lišit od aktivního okna.

  3. Přidejte následující vlastnosti do třídy sady příkazů pro konkrétní jazyk domény, abyste zjistili, jaký typ okna je aktivní.

    // 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);
        }
    }
    

Omezení výběru

Přidáním pravidel výběru můžete určit, které prvky jsou vybrány, když uživatel vybere prvek v modelu. Pokud například chcete uživateli umožnit, aby s řadou prvků zacházeli jako s jednou jednotkou, můžete použít pravidlo výběru.

Vytvoření pravidla výběru

  1. Vytvoření vlastního souboru kódu v projektu DSL

  2. Definujte třídu pravidla výběru odvozenou DiagramSelectionRules z třídy.

  3. GetCompliantSelection Přepište metodu třídy pravidla výběru, aby se použila kritéria výběru.

  4. Přidejte do souboru vlastního kódu částečnou definici třídy ClassDiagram.

    Třída ClassDiagram je odvozena od Diagram třídy a je definována v generovaném souboru kódu Diagram.cs v projektu DSL.

  5. SelectionRules Přepsat vlastnost ClassDiagram třídy vrátit vlastní pravidlo výběru.

    Výchozí implementace SelectionRules vlastnosti získá objekt pravidla výběru, který nezmění výběr.

Příklad

Následující soubor kódu vytvoří pravidlo výběru, které rozšíří výběr tak, aby zahrnovalo všechny instance všech obrazců domény, které byly původně vybrány.

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;
                }
            }
        }
    }
}