Udostępnij za pośrednictwem


Jak: dostęp i ograniczyć bieżącego zaznaczenia.

Podczas pisania obsługi polecenia lub gestu dla danego języka specyficzne dla domeny, można określić elementu, jaki użytkownik kliknął prawym przyciskiem myszy.Można również zapobiec niektóre kształty lub pola wybrane.Na przykład można rozmieścić, że gdy użytkownik kliknie ikonę dekorator, kształt, który go zawiera jest zaznaczone w zamian.Ograniczanie wyboru w ten sposób zmniejsza liczbę programów obsługi, które trzeba napisać.To ułatwia również dla użytkownika, który można kliknąć dowolne miejsce w kształcie bez konieczności uniknięcia dekorator.

Uzyskiwanie dostępu do bieżącego zaznaczenia z obsługi polecenia

Klasy zestaw poleceń dla języka specyficzne dla domeny zawiera programy obsługi polecenia dla poleceń niestandardowych.CommandSet Klasy, z którego pochodzi klasy zestaw poleceń dla języka specyficzne dla domeny, zawiera kilka członków do uzyskiwania dostępu do bieżącego zaznaczenia.

W zależności od polecenia program obsługi polecenia może być konieczne zaznaczenie w projektancie modelu, Eksplorator modelu lub aktywnego okna.

Dostęp do informacji zaznaczenia

  1. CommandSet Klasy definiuje następujące elementy, które mogą być używane do uzyskania dostępu do bieżącego zaznaczenia.

    Członkowskie

    Opis

    IsAnyDocumentSelectionCompartmentMetoda

    Zwraca true Jeśli dowolne elementy zaznaczone w projektancie modelu jest kształt Przedział; w przeciwnym razie false.

    IsDiagramSelectedMetoda

    Zwraca true zaznaczenie diagramu w projektancie modelu; w przeciwnym razie false.

    IsSingleDocumentSelectionMetoda

    Zwraca true zaznaczenie dokładnie jeden element w projektancie modelu; w przeciwnym razie false.

    IsSingleSelectionMetoda

    Zwraca true zaznaczenie dokładnie jeden element w aktywnym oknie; w przeciwnym razie false.

    CurrentDocumentSelectionWłaściwość

    Pobiera zbiór elementy zaznaczone w projektancie modelu przeznaczone tylko do odczytu.

    CurrentSelectionWłaściwość

    Zwraca kolekcję tylko do odczytu elementy zaznaczone w aktywnym oknie.

    SingleDocumentSelectionWłaściwość

    Pobiera element podstawowy zaznaczenia w projektancie modelu.

    SingleSelectionWłaściwość

    Pobiera element podstawowy zaznaczenia w aktywnym oknie.

  2. CurrentDocView Właściwość CommandSet klasy zapewnia dostęp do DiagramDocView obiekt, który reprezentuje okna Projektanta modelu i udostępnia dodatkowe wybrane elementy w projektancie modelu.

  3. Ponadto wygenerowany kod definiuje explorer narzędzie okno właściwości i właściwość wyboru programu explorer w poleceniu set klasy dla języka specyficzne dla domeny.

    • Właściwość okna explorer narzędzie zwraca instancję klasy okna narzędzia explorer języka specyficzne dla domeny.Klasa okna explorer narzędzie pochodzi od ModelExplorerToolWindow klasy i reprezentuje Eksploratora modelu dla języka specyficzne dla domeny.

    • [ExplorerSelection] Właściwość zwraca zaznaczonego elementu w oknie Eksploratora modelu dla języka specyficzne dla domeny.

Określanie, które okno jest aktywne

IMonitorSelectionService Zawiera interfejs definiuje członków, które zapewniają dostęp do bieżącego stanu zaznaczenia w powłoce.Można uzyskać IMonitorSelectionService obiektu z klasy pakietu lub klasy zestaw poleceń dla języka specyficzne dla domeny za pomocą [MonitorSelection] właściwość zdefiniowana w klasie bazowej każdego.Klasa pakiet pochodzi od ModelingPackage klasa i klasa zestaw poleceń pochodzi od CommandSet klasy.

Aby ustalić z obsługi polecenia, jakiego rodzaju okno jest aktywne

  1. MonitorSelection Właściwość CommandSet klasy zwraca IMonitorSelectionService obiekt, który zapewnia dostęp do bieżącego stanu zaznaczenia w powłoce.

  2. CurrentSelectionContainer Właściwość IMonitorSelectionService interfejsu pobiera kontenera aktywnego zaznaczenia, w którym mogą się różnić od aktywnego okna.

  3. Dodaj następujące właściwości z poleceniem set klasy dla Ciebie języka specyficzne dla domeny, aby ustalić, jakiego rodzaju okno jest aktywne.

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

Ograniczanie wyboru

Dodając reguły wyboru, można kontrolować, które elementy są zaznaczone, gdy użytkownik wybierze element w modelu.Na przykład aby zezwolić użytkownikowi na traktowanie liczba elementów jako pojedynczą jednostkę, można użyć reguły wyboru.

Aby utworzyć reguły wyboru

  1. Tworzenie pliku niestandardowego kodu w programie project DSL

  2. Zdefiniowanie klasy reguły wyboru, która wywodzi się z DiagramSelectionRules klasy.

  3. Zastąpić GetCompliantSelection metody klasy reguła wyboru zastosowania kryteriów wyboru.

  4. Dodawanie definicji częściowej klasy dla [ClassDiagram] klasy do pliku niestandardowego kodu.

    [ClassDiagram] Klasa pochodzi od Diagram klasy a jest zdefiniowany w pliku wygenerowanego kodu Diagram.cs, w programie project DSL.

  5. Zastąpić SelectionRules właściwość [ClassDiagram] klasy, aby powrócić do reguły wyboru niestandardowego.

    Domyślna implementacja z SelectionRules właściwość pobiera obiekt regułę wyboru, który nie Modyfikuj zaznaczenie.

Dd820621.collapse_all(pl-pl,VS.110).gifPrzykład

Następujący plik kod tworzy regułę wyboru, który poszerza zaznaczenie, aby uwzględnić wszystkie wystąpienia początkowo wybranych kształtów domeny.

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

Zobacz też

Informacje

CommandSet

ModelingPackage

DiagramDocView

ModelExplorerToolWindow

IMonitorSelectionService

DiagramSelectionRules

Diagram