Cómo: Tener acceso y restringir una selección

Cuando se escribe un controlador de comandos o de gestos para el lenguaje específico, puede determinar qué elemento hizo clic con el usuario.También puede evitar que algunas formas o campos tengan seleccionado.Por ejemplo, puede organizar que cuando el usuario hace clic en un elemento decorator de icono, la forma que lo contiene está seleccionado en su lugar.Restricción la selección de esta manera se reduce el número de controladores que tenga que escribir.También facilita al usuario, que puede hacer clic en cualquier parte de la forma sin tener que evitar el decorador.

Acceso de la selección actual de un controlador de comandos

La clase determinada de comando para un lenguaje específico contiene los controladores de comando para los comandos personalizados.La clase de CommandSet , que la clase determinada de comando para un lenguaje específico deriva, proporciona algunos miembros para tener acceso a la selección actual.

Dependiendo del comando, el controlador de comandos podría necesitar la selección en el diseñador de modelos, el explorador de modelos, o la ventana activa.

Para tener acceso a información de selección

  1. La clase de CommandSet define los miembros siguientes que se pueden utilizar para tener acceso a la selección actual.

    Miembro

    Descripción

    Método IsAnyDocumentSelectionCompartment

    Devuelve true si cualquiera de los elementos seleccionados en el diseñador de modelos son una forma de compartimiento; si no, false.

    Método IsDiagramSelected

    Devuelve true si el diagrama está seleccionada en el diseñador de modelos; si no, false.

    Método IsSingleDocumentSelection

    Devuelve true si un elemento es exactamente seleccionada en el diseñador de modelos; si no, false.

    Método IsSingleSelection

    devuelve true si un elemento es exactamente seleccionado en la ventana activa; si no, false.

    Propiedad CurrentDocumentSelection

    Obtiene una colección de solo lectura de los elementos seleccionados en el diseñador de modelos.

    Propiedad CurrentSelection

    Obtiene una colección de solo lectura de los elementos seleccionados en la ventana activa.

    Propiedad SingleDocumentSelection

    Obtiene el elemento primario de selección en el diseñador de modelos.

    Propiedad SingleSelection

    Obtiene el elemento primario de selección en la ventana activa.

  2. La propiedad de CurrentDocView de la clase de CommandSet proporciona acceso al objeto de DiagramDocView que representa la ventana del diseñador de modelos y proporciona acceso adicional los elementos seleccionados en el diseñador de modelos.

  3. Además, el código generado define una propiedad de la ventana de herramientas del explorador y una propiedad de selección del explorador en la clase determinada de comando para el lenguaje específico.

    • La propiedad de la ventana de herramientas del explorador devuelve una instancia de la clase de la ventana de herramientas del explorador para el lenguaje específico.La clase de la ventana de herramientas del explorador se deriva de la clase de ModelExplorerToolWindow y representa el explorador de modelos para el lenguaje específico.

    • La propiedad de [ExplorerSelection] devuelve el elemento seleccionado en la ventana modelado del explorador para el lenguaje específico.

Determinar qué ventana activa

La interfaz de IMonitorSelectionService contiene define los miembros que proporcionan acceso al estado de la selección actual en el shell.Puede obtener un objeto de IMonitorSelectionService de la clase de paquete o la clase determinada de comando para el lenguaje específico mediante la propiedad de [MonitorSelection] definido en la clase base de cada uno.La clase de paquete deriva de la clase de ModelingPackage , y la clase determinada de comando deriva de la clase de CommandSet .

Para determinar de un controlador de comandos que el tipo de ventana está activa

  1. La propiedad de MonitorSelection de la clase de CommandSet devuelve un objeto de IMonitorSelectionService que proporciona acceso al estado de la selección actual en el shell.

  2. La propiedad de CurrentSelectionContainer de la interfaz de IMonitorSelectionService obtiene el contenedor de selección activa, que puede ser diferente de la ventana activa.

  3. Agregue las siguientes propiedades a la clase determinada de comando para el lenguaje específico para determinar qué está activo el tipo de ventana.

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

Restringir la selección

Agregar reglas de selección, puede controlar qué elementos son seleccionado cuando el usuario selecciona un elemento del modelo.Por ejemplo, permitir que el usuario trate varios elementos como una sola unidad, puede utilizar una regla de selección.

para crear una regla de selección

  1. Cree un archivo de código personalizado en el proyecto ADSL

  2. Defina una clase de regla de selección que se deriva de la clase de DiagramSelectionRules .

  3. Invalide el método de GetCompliantSelection de la clase de regla de selección para aplicar los criterios de selección.

  4. Agregue una definición de clase parcial para la clase de [ClassDiagram] al archivo de código personalizado.

    La clase de [ClassDiagram] deriva de la clase de Diagram y se define en el archivo de código generado, Diagram.cs, en el proyecto ADSL.

  5. invalide la propiedad de SelectionRules de la clase de [ClassDiagram] para devolver la regla de selección personalizada.

    la implementación predeterminada de la propiedad de SelectionRules obtiene un objeto de la regla de selección que no modifique la selección.

Dd820621.collapse_all(es-es,VS.110).gifEjemplo

El archivo de código siguiente se crea una regla de selección que expanda la selección para incluir todas las instancias de cada una de las formas de dominio que estaba inicialmente seleccionado.

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

Vea también

Referencia

CommandSet

ModelingPackage

DiagramDocView

ModelExplorerToolWindow

IMonitorSelectionService

DiagramSelectionRules

Diagram