Partilhar via


Como acessar e restringir a seleção atual

Quando você escrever um manipulador de comando ou o gesto para sua linguagem específica de domínio, você pode determinar que o usuário right-clicked de elemento. Você também pode impedir alguns campos ou formas seja selecionado. Por exemplo, você pode organizar que, quando o usuário clica a decorador um ícone, a forma que ele é selecionada em vez disso. Restringindo a seleção dessa maneira reduz o número de manipuladores que você tem que escrever. Ele também torna mais fácil para o usuário, que pode clicar em qualquer lugar na forma sem ter que evitar o decorador.

Acessando a seleção atual a partir de um manipulador de comandos

A classe de conjunto de comandos para um idioma específico do domínio contém os manipuladores de comandos para seus comandos personalizados. O CommandSet classe, do qual a classe de conjunto de comandos para um idioma específico do domínio deriva, fornece alguns membros para acessar a seleção atual.

Dependendo do comando, o manipulador de comandos pode ser necessário a seleção na janela ativa, o Gerenciador de modelos ou o designer de modelo.

Para acessar informações sobre a seleção

  1. O CommandSet classe define os seguintes membros que podem ser usados para acessar a seleção atual.

    Membro

    Descrição

    Método IsAnyDocumentSelectionCompartment

    Retorna true se qualquer um dos elementos selecionados no designer de modelo é uma forma de compartimento; Caso contrário, false.

    Método IsDiagramSelected

    Retorna true se o diagrama for selecionado no designer modelo; Caso contrário, false.

    Método IsSingleDocumentSelection

    Retorna true se exatamente um elemento estiver selecionado no designer modelo; Caso contrário, false.

    Método IsSingleSelection

    Retorna true se exatamente um elemento estiver selecionado na janela ativa. Caso contrário, false.

    Propriedade CurrentDocumentSelection

    Obtém uma coleção somente leitura dos elementos selecionados no designer de modelo.

    Propriedade CurrentSelection

    Obtém uma coleção somente leitura dos elementos selecionados na janela ativa.

    Propriedade SingleDocumentSelection

    Obtém o elemento principal da seleção no designer de modelo.

    Propriedade SingleSelection

    Obtém o elemento principal da seleção na janela ativa.

  2. O CurrentDocView propriedade da CommandSet classe fornece acesso para o DiagramDocView objeto que representa a janela do designer de modelo e fornece os elementos selecionados no designer de modelo de acesso adicional.

  3. Além disso, o código gerado define uma propriedade de janela de ferramenta do explorer e uma propriedade de seleção do explorer no comando Definir classe para a linguagem específica de domínio.

    • A propriedade de janela do explorer ferramenta retorna uma instância da classe de janela de ferramenta explorer para o idioma específico do domínio. A classe de janela do explorer ferramenta deriva do ModelExplorerToolWindow de classe e representa o Gerenciador de modelos para o idioma específico do domínio.

    • O [ExplorerSelection] propriedade retorna o elemento selecionado na janela do Gerenciador de modelo para o idioma específico do domínio.

Determinando qual é a janela ativa

O IMonitorSelectionService contém a interface define os membros que fornecem acesso ao estado da seleção atual no shell. Você pode obter um IMonitorSelectionService o objeto de classe de pacote ou a classe do conjunto de comando para o idioma específico do domínio por meio do [MonitorSelection] propriedade definida na classe base de cada. A classe package deriva o ModelingPackage deriva de classe e a classe de conjunto de comando da CommandSet classe.

Determinar a partir de um manipulador de comandos que tipo de janela está ativo

  1. O MonitorSelection propriedade da CommandSet classe retorna um IMonitorSelectionService objeto fornece acesso para o estado da seleção atual no shell.

  2. O CurrentSelectionContainer propriedade da IMonitorSelectionService interface obtém o contêiner de seleção ativa, que pode ser diferente da janela ativa.

  3. Adicione que as seguintes propriedades para o comando definam classe para você linguagem específica de domínio para determinar que tipo de janela está ativo.

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

Restringindo a seleção

Adicionando regras de seleção, você pode controlar quais elementos são selecionados quando o usuário seleciona um elemento no modelo. Por exemplo, para permitir que o usuário tratar de um número de elementos como uma única unidade, você pode usar uma regra de seleção.

Para criar uma regra de seleção

  1. Criar um arquivo de código personalizado no projeto DSL

  2. Definir uma classe de regra de seleção que é derivada de DiagramSelectionRules classe.

  3. Substituir o GetCompliantSelection método da classe de regra de seleção para aplicar os critérios de seleção.

  4. Adicionar uma definição de classe parcial para o [ClassDiagram] classe ao seu arquivo de código personalizado.

    O [ClassDiagram] classe deriva de Diagram de classe e é definido no arquivo código gerado, Diagram.cs, no projeto DSL.

  5. Substituir o SelectionRules propriedade da [ClassDiagram] classe para retornar a regra de seleção personalizada.

    A implementação padrão da SelectionRules propriedade obtém um objeto de regra de seleção que não modifica a seleção.

Exemplo

O arquivo de código a seguir cria uma regra de seleção que expande a seleção para incluir todas as instâncias de cada uma das formas de domínio que foi inicialmente selecionado.

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

Consulte também

Referência

CommandSet

ModelingPackage

DiagramDocView

ModelExplorerToolWindow

IMonitorSelectionService

DiagramSelectionRules

Diagram