Zugreifen auf die und Einschränken der aktuellen Auswahl
Wenn Sie für Ihre domänenspezifische Sprache einen Befehls- oder Gestenhandler schreiben, können Sie bestimmen, auf welches Element die Benutzer*innen mit der rechten Maustaste geklickt haben. Sie können auch verhindern, dass bestimmte Formen oder Felder ausgewählt werden. So können Sie beispielsweise festlegen, dass beim Klicken auf einen Icon Decorator stattdessen die Form ausgewählt wird, die ihn enthält. Wenn Sie die Auswahl auf diese Weise einschränken, müssen Sie weniger Handler schreiben. Dadurch verbessern Sie auch die Benutzererfahrung, da Benutzer*innen auf eine beliebige Stelle in der Form klicken können, ohne den Decorator umgehen zu müssen.
Zugreifen auf die aktuelle Auswahl über einen Befehlshandler
Die Befehlssatzklasse für eine domänenspezifische Sprache enthält die Befehlshandler für Ihre benutzerdefinierten Befehle. Die CommandSet-Klasse, von der die Befehlssatzklasse für eine domänenspezifische Sprache abgeleitet wird, stellt einige Member für den Zugriff auf die aktuelle Auswahl bereit.
Je nach Befehl benötigt der Befehlshandler die Auswahl z. B. im Modell-Designer, im Modell-Explorer oder im aktiven Fenster.
So greifen Sie auf Auswahlinformationen zu
Die CommandSet-Klasse definiert die folgenden Member, die für den Zugriff auf die aktuelle Auswahl verwendet werden können.
Member BESCHREIBUNG IsAnyDocumentSelectionCompartment-Methode Gibt true
zurück, wenn eines der im Modell-Designer ausgewählten Elemente eine Depotform ist, andernfallsfalse
.IsDiagramSelected-Methode Gibt true
zurück, wenn das Diagramm im Modell-Designer ausgewählt ist, andernfallsfalse
.IsSingleDocumentSelection-Methode Gibt true
zurück, wenn genau ein Element im Modell-Designer ausgewählt ist, andernfallsfalse
.IsSingleSelection-Methode Gibt true
zurück, wenn genau ein Element im aktiven Fenster ausgewählt ist, andernfallsfalse
.CurrentDocumentSelection-Eigenschaft Ruft eine schreibgeschützte Auflistung der im Modell-Designer ausgewählten Elemente ab. CurrentSelection-Eigenschaft Ruft eine schreibgeschützte Auflistung der im aktiven Fenster ausgewählten Elemente ab. SingleDocumentSelection-Eigenschaft Ruft das primäre Element der Auswahl im Modell-Designer ab. SingleSelection-Eigenschaft Ruft das primäre Element der Auswahl im aktiven Fenster ab. Die CurrentDocView-Eigenschaft der CommandSet-Klasse bietet Zugriff auf das DiagramDocView-Objekt, das das Modell-Designer-Fenster darstellt, und bietet zusätzlichen Zugriff auf die ausgewählten Elemente im Modell-Designer.
Darüber hinaus definiert der generierte Code eine Eigenschaft für das Explorer-Toolfenster und für die Explorer-Auswahl in der Befehlssatzklasse für die domänenspezifische Sprache.
Die Eigenschaft für das Explorer-Toolfenster gibt eine Instanz der Klasse für das Explorer-Toolfenster für die domänenspezifische Sprache zurück. Die Klasse für das Explorer-Toolfenster wird von der ModelExplorerToolWindow-Klasse abgeleitet und stellt den Modell-Explorer für die domänenspezifische Sprache dar.
Die
ExplorerSelection
-Eigenschaft gibt das ausgewählte Element im Modell-Explorer-Fenster für die domänenspezifische Sprache zurück.
Bestimmen des aktiven Fensters
Die Schnittstelle IMonitorSelectionService enthält Member, die Zugriff auf den aktuellen Auswahlzustand in der Shell ermöglichen. Sie können ein IMonitorSelectionService-Objekt entweder aus der Paketklasse oder aus der Befehlssatzklasse für die domänenspezifische Sprache über die in der Basisklasse der einzelnen Objekte definierte Eigenschaft MonitorSelection
abrufen. Die Paketklasse wird von der ModelingPackage-Klasse abgeleitet, die Befehlssatzklasse von der CommandSet-Klasse.
So ermitteln Sie über einen Befehlshandler, welcher Fenstertyp aktiv ist
Die MonitorSelection-Eigenschaft der CommandSet-Klasse gibt ein IMonitorSelectionService-Objekt zurück, das Zugriff auf den aktuellen Auswahlzustand in der Shell ermöglicht.
Die CurrentSelectionContainer-Eigenschaft der IMonitorSelectionService-Schnittstelle ruft den aktiven Auswahlcontainer ab, der sich vom aktiven Fenster unterscheiden kann.
Fügen Sie der Befehlssatzklasse für Ihre domänenspezifische Sprache die folgenden Eigenschaften hinzu, um den aktiven Fenstertyp zu bestimmen.
// 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); } }
Einschränken der Auswahl
Durch Hinzufügen von Auswahlregeln können Sie steuern, welche Elemente ausgewählt werden, wenn Benutzer*innen auf ein Element im Modell klicken. Mithilfe einer Auswahlregel können Benutzer*innen beispielsweise eine Reihe von Elementen als einzelne Einheit behandeln.
So erstellen Sie eine Auswahlregel
Erstellen Sie im DSL-Projekt eine benutzerdefinierte Codedatei.
Definieren Sie eine Auswahlregelklasse, die von der DiagramSelectionRules-Klasse abgeleitet wird.
Überschreiben Sie die Methode GetCompliantSelection der Auswahlregelklasse, um die Auswahlkriterien anzuwenden.
Fügen Sie der benutzerdefinierten Codedatei eine partielle Klassendefinition für die ClassDiagram-Klasse hinzu.
Die
ClassDiagram
-Klasse wird von der Diagram-Klasse abgeleitet und in der generierten Codedatei „Diagram.cs“ im DSL-Projekt definiert.Überschreiben Sie die SelectionRules-Eigenschaft der
ClassDiagram
-Klasse, um die benutzerdefinierte Auswahlregel zurückzugeben.Die Standardimplementierung der SelectionRules-Eigenschaft ruft ein Auswahlregelobjekt ab, das die Auswahl nicht ändert.
Beispiel
Mit der folgenden Codedatei wird eine Auswahlregel erstellt, die die Auswahl so erweitert, dass alle Instanzen der ursprünglich ausgewählten Domänenformen eingeschlossen werden.
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;
}
}
}
}
}