Gewusst wie: Zugreifen auf die und Einschränken der aktuellen Auswahl
Wenn Sie einen Befehl oder eines Gestenhandlers für die domänenspezifische Sprache schreiben, können Sie bestimmen, auf welches Element der Benutzer mit der rechten Maustaste geklickt hat.Sie können mehrere Formen oder Felder ausgewählt werden ebenfalls verhindern.Sie können z. B. so angeordnet werden, dass, wenn der Benutzer auf ein Symbol klickt, decorator-element die Format enthält, stattdessen ausgewählt ist.Die Auswahl wird einschränkend auf diese Weise die Anzahl von Handlern, die Sie schreiben müssen.Sie können auch einfacher für den Benutzer, der auf eine beliebige Stelle im Formular klicken kann, ohne das Decorator-Element zu vermeiden.
Die aktuelle Auswahl eines Befehls-Handler zugreifen.
Die festgelegte Klasse des Befehls für eine domänenspezifische Sprache enthält die Befehlshandler für die benutzerdefinierten Befehle.Die CommandSet-Klasse, von der die Klasse des Befehls für eine domänenspezifische Sprache abgeleitet ist, stellt mehrere Member für den Zugriff auf die aktuelle Auswahl bereit.
Abhängig vom Befehl muss der Befehlshandler möglicherweise die Auswahl im Modell-Designer Modell im Projektmappen-Explorer oder im aktiven Fenster.
Weitere Informationen zur Auswahl zugreifen
Die CommandSet-Klasse definiert die folgenden Member, die verwendet werden können, um die aktuelle Auswahl zuzugreifen.
Member
Beschreibung
Gibt true wenn eines der Elemente zurück, die im Modell-Designer ausgewählt werden, ist eine Depot Form. andernfalls false.
IsDiagramSelected-Methode
Gibt true zurück, wenn das Diagramm im Modell-Designer ausgewählt ist. andernfalls false.
IsSingleDocumentSelection-Methode
Gibt true zurück, wenn genau ein Element im Modell-Designer ausgewählt ist. andernfalls false.
IsSingleSelection-Methode
Gibt true zurück, wenn genau ein Element im aktuellen Fenster ausgewählt wird. andernfalls false.
CurrentDocumentSelection-Eigenschaft
Ruft eine schreibgeschützte Auflistung der Elemente ab, die im Modell-Designer ausgewählt werden.
CurrentSelection-Eigenschaft
Ruft eine schreibgeschützte Auflistung der Elemente ab, die im aktuellen Fenster ausgewählt sind.
SingleDocumentSelection-Eigenschaft
Ruft das Grundelement der Auswahl im Modell-Designer ab.
SingleSelection-Eigenschaft
Ruft das Grundelement der Auswahl im aktiven Fensters ab.
Die CurrentDocView-Eigenschaft der CommandSet-Klasse ermöglicht den Zugriff auf das DiagramDocView-Objekt, das das Modell-Designer-Fenster darstellt und zusätzlichen Zugriff auf die ausgewählten Elemente im Modell-Designer bietet.
Darüber hinaus definiert der generierte Code auf eine Eigenschaft und eine Explorer-Auswahl Projektmappen-Explorer tool-Fenster Eigenschaft in der festgelegten Klasse des Befehls für die domänenspezifische Sprache.
Die Eigenschaft gibt eine Instanz tool-Fenster Projektmappen-Explorer im Projektmappen-Explorer fensterklasse Tool für die domänenspezifische Sprache zurück.Die Explorer fensterklasse Tool leitet sich von der ModelExplorerToolWindow-Klasse 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, welche Fenster aktiv ist
Die Schnittstelle enthält IMonitorSelectionService-Member definiert wird, die Zugriff auf den aktuellen Auswahlzustand in der Shell ermöglichen.Sie können ein Paket IMonitorSelectionService-Objekt von der Klasse oder von der festgelegten Klasse des Befehls für die domänenspezifische Sprache von den [MonitorSelection]-Eigenschaft abrufen, die von jedem in der Basisklasse definiert ist.Die Paket Klasse leitet sich von der ModelingPackage-Klasse und die Klasse des Befehls leitet sich von der CommandSet-Klasse.
So fügen Sie einen Befehlshandler bestimmen, welcher Typ von Fenster aktiv ist
Die MonitorSelection-Eigenschaft der CommandSet-Klasse gibt ein IMonitorSelectionService-Objekt zurück, das den Zugriff auf den aktuellen Auswahlzustand in der Shell bietet.
Die CurrentSelectionContainer-Eigenschaft der IMonitorSelectionService-Schnittstelle ruft den Container der aktuellen Auswahl ab, der dem aktiven Fenster unterscheiden kann.
Fügen Sie die folgenden Eigenschaften der festgelegten Klasse des Befehls für Sie domänenspezifische Sprache hinzu, um zu ermitteln, welcher Typ von Fenster aktiv ist.
// 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); } }
Die Auswahl einschränken
Mit Auswahlregeln hinzufügen, können Sie steuern, welche Elemente ausgewählt werden, wenn der Benutzer ein Element auswählt im Modell.Um beispielsweise dem Benutzer zu ermöglichen, verschiedene Elemente als Einheit zu behandeln, können Sie die Regel eine Auswahl verwenden.
So erstellen Sie die Regel eine Auswahl
Erstellen Sie eine benutzerdefinierte Codedatei im DSL-Projekt
Definieren Sie eine Auswahl die Regel Klasse, die von der DiagramSelectionRules-Klasse abgeleitet ist.
Überschreiben Sie die GetCompliantSelection-Methode der Auswahl die Regel Klasse, um die Auswahlkriterien anzuwenden.
Fügen Sie eine partielle Klassendefinition für die Klasse [ClassDiagram] der benutzerdefinierten Codedatei hinzu.
Die [ClassDiagram]-Klasse leitet sich von der Diagram-Klasse und in der generierten Codedatei im Diagram.cs DSL-Projekt definiert.
Überschreiben Sie die SelectionRules-Eigenschaft der [ClassDiagram]-Klasse, um die benutzerdefinierte Auswahl die Regel zurückzugeben.
Die Standardimplementierung der SelectionRules-Eigenschaft ruft ein Objekt ab, das die Regel Auswahl nicht die Auswahl ändert.
Beispiel
Die folgende Codedatei erstellt eine Auswahl die Regel, die die Auswahl erweitert, um alle Instanzen der einzelnen Domänen zu modellieren, die ursprünglich ausgewählt wurde.
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;
}
}
}
}
}