Ändern eines Standardmenübefehls in einer domänenspezifischen Sprache
Sie können das Verhalten einiger Standardbefehle ändern, die automatisch im DSL definiert sind. Beispielsweise können Sie Ausschneiden so ändern, dass es vertrauliche Informationen ausschließt. Hierzu überschreiben Sie Methoden in einer festgelegten Klasse des Befehls. Diese Klassen sind in der CommandSet.cs-Datei im DslPackage-Projekt definiert und von CommandSet abgeleitet.
Hinweis
Wenn Sie eigene Menübefehle erstellen möchten, lesen Sie Vorgehensweise: Hinzufügen eines Befehls zum Kontextmenü.
Welche Befehle können Sie ändern?
So ermitteln Sie, welche Befehle Sie ändern können
Öffnen Sie im
DslPackage
-Projekt die DateiGeneratedCode\CommandSet.cs
. Sie finden diese C#-Datei im Projektmappen-Explorer als untergeordnetes Element vonCommandSet.tt
.Suchen Sie in dieser Datei Klassen, deren Namen auf
CommandSet
enden. Beispiele hierfür sindLanguage1CommandSet
undLanguage1ClipboardCommandSet
.Geben Sie in jeder festgelegten Klasse des Befehls "
override
" gefolgt von einem Leerzeichen ein. IntelliSense zeigt eine Liste der Methoden an, die Sie überschreiben können. Jeder Befehl verfügt über ein Paar von Methoden, deren Namen mit "ProcessOnStatus
" und "ProcessOnMenu
" beginnen.Beachten Sie, welche der festgelegten Klassen des Befehls den Befehl enthält, den Sie verändern möchten.
Schließen Sie die Datei, ohne Ihre Änderungen zu speichern.
Hinweis
Normalerweise sollten Sie keine Dateien bearbeiten, die generiert wurden. Änderungen gehen verloren, wenn die Dateien das nächste Mal generiert werden.
Erweitern der entsprechenden festgelegten Klasse des Befehls
Erstellen Sie eine neue Datei, die eine partielle Deklaration der festgelegten Klasse des Befehls enthält.
So erweitern Sie die festgelegte Klasse des Befehls
Öffnen Sie im Projektmappen-Explorer im Projekt "DslPackage" den Ordner "GeneratedCode". Suchen Sie unter "CommandSet.tt" die generierte Datei "CommandSet.cs", und öffnen Sie sie. Notieren Sie sich den Namespace und den Namen der ersten dort definierten Klasse. Es wird beispielsweise Folgendes angezeigt:
namespace Company.Language1
{ ... internal partial class Language1CommandSet : ...
Erstellen Sie im DslPackage einen Ordner mit dem Namen Custom Code. Erstellen Sie in diesem Ordner eine neue Klassendatei mit dem Namen
CommandSet.cs
.Schreiben Sie in die neue Datei eine partielle Deklaration mit demselben Namespace und Namen wie die generierte partielle Klasse. Beispiel:
using System; using System.Collections.Generic; using System.ComponentModel.Design; namespace Company.Language1 /* Make sure this is correct */ { internal partial class Language1CommandSet { ...
Hinweis
Wenn Sie die Klassendateivorlage verwendet haben, um die neue Datei zu erstellen, müssen Sie sowohl Namespace als auch Klassenname korrigieren.
Überschreiben der Befehlsmethoden
Die meisten Befehle haben zwei zugeordnete Methoden: Die Methode mit einem Namen wie ProcessOnStatus
... bestimmt, ob der Befehl sichtbar sein und aktiviert werden soll. Sie wird aufgerufen, wenn der Benutzer mit der rechten Maustaste auf das Diagramm klickt und sollte schnell ausgeführt werden sowie keine Änderungen vornehmen. ProcessOnMenu
... wird aufgerufen, wenn Benutzer*innen auf den Befehl klickt, und sollte die Funktion des Befehls ausführen. Sie können eine dieser oder beide Methoden überschreiben.
Ändern, wann der Befehl in einem Menü angezeigt wird
Überschreiben Sie die Methode „ProcessOnStatus...“. Diese Methode sollte für den Parameter MenuCommand die Eigenschaften "Visible" (sichtbar) und "Enabled" (aktiviert) festlegen. Meist prüft der Befehl CurrentSelection, um zu bestimmen, ob der Befehl auf die ausgewählten Elemente zutrifft. Möglicherweise werden auch die Eigenschaften geprüft, um zu bestimmen, ob der Befehl bei deren aktuellem Status angewendet werden kann.
Allgemein gilt, die Eigenschaft "Visible" sollte dadurch bestimmt werden, welche Elemente ausgewählt sind. Die Eigenschaft "Enabled", die bestimmt, ob der Befehl im Menü schwarz oder ausgegraut angezeigt wird, sollte vom aktuellen Status der Auswahl abhängen.
Im folgenden Beispiel wird das Menüelement "Delete" (Löschen) deaktiviert, wenn der Benutzer mehr als eine Form ausgewählt hat.
Hinweis
Diese Methode beeinflusst nicht, ob der Befehl über eine Tastatureingabe verfügbar ist. Zum Beispiel verhindert das Deaktivieren des Menüelements "Delete" (Löschen) nicht, dass der Befehl über die Entf-Taste ausgelöst wird.
/// <summary>
/// Called when user right-clicks on the diagram or clicks the Edit menu.
/// </summary>
/// <param name="command">Set Visible and Enabled properties.</param>
protected override void ProcessOnStatusDeleteCommand (MenuCommand command)
{
// Default settings from the base method.
base.ProcessOnStatusDeleteCommand(command);
if (this.CurrentSelection.Count > 1)
{
// If user has selected more than one item, Delete is greyed out.
command.Enabled = false;
}
}
Es ist empfehlenswert, zuerst die Basismethode aufzurufen, um alle Fälle und Einstellungen zu behandeln, die nicht enthalten sind.
Die ProcessOnStatus-Methode sollte Elemente im Speicher nicht erstellen, löschen oder aktualisieren.
So ändern Sie das Verhalten des Befehls
Überschreiben Sie die Methode „ProcessOnMenu...“. Im folgenden Beispiel wird der Benutzer davon abgehalten, mehr als ein Element auf einmal zu löschen, selbst mit der Entf-Taste.
/// <summary>
/// Called when user presses Delete key
/// or clicks the Delete command on a menu.
/// </summary>
protected override void ProcessOnMenuDeleteCommand()
{
// Allow users to delete only one thing at a time.
if (this.CurrentSelection.Count <= 1)
{
base.ProcessOnMenuDeleteCommand();
}
}
Wenn der Code Änderungen am Speicher vornimmt, wie Erstellen, Löschen oder Aktualisieren von Elementen oder Links, muss dies innerhalb einer Transaktion erfolgen. Weitere Informationen finden Sie unter Erstellen und Aktualisieren der Modellelemente.
Schreiben des Methodencodes
Die folgenden Fragmente sind innerhalb dieser Methoden oft hilfreich:
this.CurrentSelection
. Die Form, die der Benutzer mit der rechten Maustaste angeklickt hat, ist immer in dieser Liste mit Formen und Konnektoren enthalten. Wenn der Benutzer auf einen leeren Bereich des Diagramms klickt, ist das Diagramm das einzige Mitglied der Liste.this.IsDiagramSelected()
-true
, wenn Benutzer*innen auf einen leeren Bereich des Diagramms geklickt habenthis.IsCurrentDiagramEmpty()
this.IsSingleSelection()
: Der Benutzer bzw. die Benutzerin hat nicht mehrere Formen ausgewählt.this.SingleSelection
: Die Form oder das Diagramm, auf die Benutzer*innen mit der rechten Maustaste geklickt habenshape.ModelElement as MyLanguageElement
: Das Modellelement, das durch eine Form dargestellt wird
Weitere Informationen zum Navigieren von Element zu Element sowie zum Erstellen von Objekten finden Sie unter Navigieren in und Aktualisieren von Modellen im Programmcode.
Zugehöriger Inhalt
- MenuCommand
- Schreiben von Code zum Anpassen einer domänenspezifischen Sprache
- Gewusst wie: Hinzufügen eines Befehls zum Kontextmenü
- Hinzufügen von Benutzeroberflächenelementen mit VSPackages
- VSCT-Dateien (Visual Studio Command Table)
- VSCT-XML-Schemareferenz
- VMSDK – Beispiel für ein Kreisdiagramm. Umfangreiche DSL-Anpassung