Gewusst wie: Ä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.
Alles in allem ändern Sie einen Befehl folgendermaßen:
Ermitteln Sie, welche Befehle Sie ändern können.
Erstellen Sie eine partielle Deklaration der entsprechenden festgelegten Klasse des Befehls.
Überschreiben Sie die Methoden ProcessOnStatus und ProcessOnMenu methods für den Befehl.
In diesem Thema wird diese Vorgehensweise erläutert.
Hinweis
Wenn Sie eigene Menübefehle erstellen möchten, finden Sie Informationen dazu unter Gewusst wie: 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 GeneratedCode\CommandSet.cs. Sie finden diese C#-Datei im Projektmappen-Explorer als untergeordnetes Element von CommandSet.tt.
Suchen Sie in dieser Datei Klassen, deren Namen auf "CommandSet" enden. Beispiele hierfür sind Language1CommandSet und Language1ClipboardCommandSet.
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 Solution Explorer, im DslPackage-Projekt, den Ordner "GeneratedCode". Öffnen Sie dann unter "CommandSet.tt" die generierte Datei "CommandSet.cs". Beachten Sie Namespace und Name der ersten Klasse, die hier definiert ist. 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, die den gleichen Namespace und Namen wie die generierte partielle Klasse besitzt. 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 verfügen über zwei zugehörige Methoden: Die Methode mit einem Namen wie ProcessOnStatus... bestimmt, ob der Befehl sichtbar und aktiviert ist. 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 der Benutzer 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 ProcessOnStatus... -Methode. 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 ProcessOnMenu... -Methode. 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 Gewusst wie: Ändern eines Standardmenübefehls in einer domänenspezifischen Sprache.
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 Teil des Diagramms klickt, ist das Diagramm als einziges Teil der Liste.
this.IsDiagramSelected() – true wenn der Benutzer auf einen leeren Teil des Diagramms geklickt hat.
this.IsCurrentDiagramEmpty()
this.IsSingleSelection() – Der Benutzer hat nicht mehrere Formen ausgewählt.
this.SingleSelection – Die Form oder das Diagramm, welche/s der Benutzer mit der rechten Maustaste angeklickt hat
shape.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 Navigating and Updating a Model in Program Code.
Siehe auch
Aufgaben
Gewusst wie: Hinzufügen eines Befehls zum Kontextmenü
[umleiten] Exemplarische Vorgehensweise: Abrufen von Informationen von einem ausgewählten Link
Referenz
Konzepte
Wie VSPackages Benutzeroberflächenelemente Hinzufügen der IDE
Weitere Ressourcen
Writing Code to Customise a Domain-Specific Language
(Visual Studio-Befehls-Tabelle. Dateien Vsct)
VMSDK – Beispiel für ein Kreisdiagramm. Umfassende DSL-Anpassung