Procedura: accedere e vincolare la selezione corrente
Quando si scrive un comando o un gestore movimenti per il linguaggio specifico di dominio, è possibile determinare quale elemento l'utente ha fatto clic con il pulsante destro del mouse.È inoltre possibile impedire alcune forme o campi da essere selezionato.Ad esempio, è possibile disporre che quando l'utente fa clic su un elemento Decorator icona, la forma che lo contiene è selezionata anziché.Limitare la selezione in questo modo è possibile ridurre il numero dei gestori che è necessario scrivere.Rende più facile per l'utente, che può fare clic in qualsiasi punto della forma senza dover evitare elemento Decorator.
Accedere alla selezione corrente da un gestore comando
La classe con set di comando per un linguaggio specifico di dominio contiene i gestori comandi per i controlli personalizzati.CommandSet la classe, che la classe con set di comando per un linguaggio specifico di dominio deriva da, fornisce ad alcuni membri per accedere alla selezione corrente.
A seconda del comando, il gestore comando potrebbe essere necessario della selezione nella finestra di progettazione di modello, nell'esploratore di modello, o nella finestra attiva.
Per accedere a informazioni di selezione
CommandSet la classe definisce i seguenti membri che possono essere utilizzati per accedere alla selezione corrente.
Membro
Descrizione
Restituisce true se uno degli elementi selezionati nella finestra di progettazione di modello è una forma di raggruppamento, in caso contrario, false.
Metodo IsDiagramSelected
Restituisce true se il diagramma viene selezionato nella finestra di progettazione di modello; in caso contrario, false.
Metodo IsSingleDocumentSelection
Restituisce true se esattamente un elemento viene selezionato nella finestra di progettazione di modello; in caso contrario, false.
Metodo IsSingleSelection
Restituisce true se esattamente un elemento viene selezionato nella finestra attiva, in caso contrario, false.
Proprietà CurrentDocumentSelection
Ottiene una raccolta di sola lettura degli elementi selezionati nella finestra di progettazione di modello.
Proprietà CurrentSelection
Ottiene una raccolta di sola lettura degli elementi selezionati nella finestra attiva.
Proprietà SingleDocumentSelection
Ottiene l'elemento principale della selezione nella finestra di progettazione di modello.
Proprietà SingleSelection
Ottiene l'elemento principale della selezione nella finestra attiva.
CurrentDocView proprietà di CommandSet la classe fornisce l'accesso a DiagramDocView oggetto che rappresenta la finestra di progettazione di modello e consente di accedere aggiuntivo gli elementi selezionati nella finestra di progettazione di modello.
Inoltre, il codice generato viene definita una proprietà di navigazione della finestra degli strumenti e una proprietà di navigazione di selezione nella classe con set di comando per il linguaggio specifico di dominio.
La proprietà di navigazione della finestra degli strumenti restituisce un'istanza della classe di visualizzazione della finestra degli strumenti per il linguaggio specifico di dominio.La classe di visualizzazione della finestra degli strumenti deriva da ModelExplorerToolWindow classificare e rappresentare in esplora modelli scegliere da di template per il linguaggio specifico di dominio.
[ExplorerSelection] la proprietà restituisce l'elemento selezionato nella finestra di esplorazione di template per il linguaggio specifico di dominio.
Determinare quale finestra è attiva
IMonitorSelectionService l'interfaccia contiene definisce i membri che consentono l'accesso dello stato di selezione corrente nella shell.È possibile ottenere IMonitorSelectionService oggetto dalla classe del pacchetto o dalla classe con set di comando per il linguaggio specifico di dominio con [MonitorSelection] proprietà definita nella classe base per ciascuno di essi.La classe del pacchetto deriva da ModelingPackage classe e la classe con set di comando deriva da CommandSet classe.
Per determinare da un gestore comando che tipo di finestra è attiva
MonitorSelection proprietà di CommandSet la classe restituisce IMonitorSelectionService oggetto che fornisce l'accesso allo stato di selezione corrente nella shell.
CurrentSelectionContainer proprietà di IMonitorSelectionService l'interfaccia ottiene il contenitore attivo di selezione, che può essere diverso dalla finestra attiva.
Aggiungere le seguenti proprietà alla classe con set di comando per il linguaggio specifico di dominio per determinare il tipo di finestra è attiva.
// 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); } }
Limitare la selezione
Aggiungendo le regole di selezione, è possibile controllare quali elementi sono selezionati quando l'utente seleziona un elemento nel modello.Ad esempio, per consentire a chi tratti una serie di elementi come una singola unità, è possibile utilizzare una regola di selezione.
Per creare una regola di selezione
Creare un file di codice personalizzato nel progetto di modello DSL
Definire una classe di regole di selezione che deriva da DiagramSelectionRules classe.
eseguire l'override GetCompliantSelection metodo della classe della regola di selezione per applicare i criteri di selezione.
aggiungere una definizione di classe parziale per [ClassDiagram] classificare nel file di codice personalizzato.
[ClassDiagram] la classe deriva da Diagram la classe e che sia definito nel file di codice generato, Diagram.cs, nel progetto di modello DSL.
eseguire l'override SelectionRules proprietà di [ClassDiagram] classe per restituire la regola di selezione personalizzata.
L'implementazione predefinita di SelectionRules la proprietà ottiene un oggetto regola di selezione che non modifica la selezione.
Esempio
Il seguente file di codice crea una regola di selezione che espande la selezione per includere tutte le istanze di tutte le forme di dominio che inizialmente sia stato selezionato.
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;
}
}
}
}
}