Modyfikowanie standardowego polecenia menu w języku specyficznym dla domeny
Możesz zmodyfikować zachowanie niektórych standardowych poleceń zdefiniowanych automatycznie w środowisku DSL. Można na przykład zmodyfikować wycinanie , aby wykluczyć poufne informacje. W tym celu należy zastąpić metody w klasie zestawu poleceń. Te klasy są definiowane w pliku CommandSet.cs w projekcie DslPackage i pochodzą z CommandSetklasy .
Uwaga
Jeśli chcesz utworzyć własne polecenia menu, zobacz Instrukcje: Dodawanie polecenia do menu skrótów.
Jakie polecenia można zmodyfikować?
Aby dowiedzieć się, jakie polecenia można zmodyfikować
W projekcie
DslPackage
otwórz plikGeneratedCode\CommandSet.cs
. Ten plik w języku C# można znaleźć w Eksplorator rozwiązań jako spółka zależna .CommandSet.tt
Znajdź klasy w tym pliku, których nazwy kończą się ciągiem "
CommandSet
", na przykładLanguage1CommandSet
iLanguage1ClipboardCommandSet
.W każdej klasie zestawu poleceń wpisz "
override
", a następnie spację. Funkcja IntelliSense wyświetli listę metod, które można zastąpić. Każde polecenie ma parę metod, których nazwy zaczynają się od "ProcessOnStatus
" i "ProcessOnMenu
".Zwróć uwagę, które z klas zestawu poleceń zawiera polecenie, które chcesz zmodyfikować.
Zamknij plik bez zapisywania zmian.
Uwaga
Zazwyczaj nie należy edytować plików, które zostały wygenerowane. Wszelkie zmiany zostaną utracone przy następnym wygenerowaniu plików.
Rozszerzanie odpowiedniej klasy zestawu poleceń
Utwórz nowy plik zawierający częściową deklarację klasy zestawu poleceń.
Aby rozszerzyć klasę Zestaw poleceń
W Eksplorator rozwiązań w projekcie DslPackage otwórz folder GeneratedCode, a następnie wyszukaj CommandSet.tt i otwórz wygenerowany plik CommandSet.cs. Zanotuj przestrzeń nazw i nazwę pierwszej klasy, która jest tam zdefiniowana. Możesz na przykład zobaczyć następujące elementy:
namespace Company.Language1
{ ... internal partial class Language1CommandSet : ...
W folderze DslPackage utwórz folder o nazwie Kod niestandardowy. W tym folderze utwórz nowy plik klasy o nazwie
CommandSet.cs
.W nowym pliku napisz deklarację częściową, która ma taką samą przestrzeń nazw i nazwę jak wygenerowana klasa częściowa. Na przykład:
using System; using System.Collections.Generic; using System.ComponentModel.Design; namespace Company.Language1 /* Make sure this is correct */ { internal partial class Language1CommandSet { ...
Uwaga
Jeśli użyto szablonu pliku klasy do utworzenia nowego pliku, musisz poprawić zarówno przestrzeń nazw, jak i nazwę klasy.
Zastąpij metody poleceń
Większość poleceń ma dwie skojarzone metody: metoda o nazwie podobnej do ProcessOnStatus
... określa, czy polecenie powinno być widoczne i włączone. Jest on wywoływany za każdym razem, gdy użytkownik kliknie diagram prawym przyciskiem myszy i powinien zostać wykonany szybko i nie wprowadza żadnych zmian. ProcessOnMenu
... jest wywoływana, gdy użytkownik kliknie polecenie i powinien wykonać funkcję polecenia. Możesz zastąpić jedną lub obie te metody.
Aby zmienić czas wyświetlania polecenia w menu
Zastąpij parametr ProcessOnStatus... Metoda. Ta metoda powinna ustawić właściwości Visible i Enabled parametru MenuPolecenia. Zazwyczaj polecenie sprawdza to. CurrentSelection w celu określenia, czy polecenie ma zastosowanie do wybranych elementów, i może również przyjrzeć się ich właściwościom, aby określić, czy polecenie można zastosować w bieżącym stanie.
Ogólnie rzecz biorąc, właściwość Visible powinna być określana przez wybrane elementy. Właściwość Enabled, która określa, czy polecenie wydaje się czarne, czy szare w menu, powinno zależeć od bieżącego stanu zaznaczenia.
Poniższy przykład wyłącza element menu Usuń, gdy użytkownik wybrał więcej niż jeden kształt.
Uwaga
Ta metoda nie ma wpływu na to, czy polecenie jest dostępne za pomocą naciśnięcia klawisza. Na przykład wyłączenie elementu menu Usuń nie uniemożliwia wywoływanie polecenia za pomocą klucza Usuń.
/// <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;
}
}
Dobrym rozwiązaniem jest najpierw wywołanie metody podstawowej, aby radzić sobie ze wszystkimi przypadkami i ustawieniami, z którymi nie jesteś zainteresowany.
Metoda ProcessOnStatus nie powinna tworzyć, usuwać ani aktualizować elementów w Magazynie.
Aby zmienić zachowanie polecenia
Zastąpij element ProcessOnMenu... Metoda. Poniższy przykład uniemożliwia użytkownikowi usunięcie więcej niż jednego elementu jednocześnie, nawet przy użyciu klucza Usuń.
/// <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();
}
}
Jeśli kod wprowadza zmiany w Sklepie, takie jak tworzenie, usuwanie lub aktualizowanie elementów lub łączy, należy to zrobić wewnątrz transakcji. Aby uzyskać więcej informacji, zobacz How to Create and Update model elements (Jak tworzyć i aktualizować elementy modelu).
Pisanie kodu metod
Następujące fragmenty są często przydatne w tych metodach:
this.CurrentSelection
. Kształt, który użytkownik kliknął prawym przyciskiem myszy, jest zawsze zawarty na tej liście kształtów i łączników. Jeśli użytkownik kliknie pustą część diagramu, diagram jest jedynym członkiem listy.this.IsDiagramSelected()
-true
jeśli użytkownik kliknął pustą część diagramu.this.IsCurrentDiagramEmpty()
this.IsSingleSelection()
— użytkownik nie wybrał wielu kształtówthis.SingleSelection
— kształt lub diagram, który użytkownik kliknął prawym przyciskiem myszyshape.ModelElement as MyLanguageElement
- element modelu reprezentowany przez kształt.
Aby uzyskać więcej informacji na temat przechodzenia z elementu do elementu i sposobu tworzenia obiektów i linków, zobacz Nawigowanie i aktualizowanie modelu w kodzie programu.
Powiązana zawartość
- MenuCommand
- Pisanie kodu pod kątem dostosowywania języka specyficznego dla domeny
- Instrukcje: Dodawanie polecenia do menu skrótów
- Dodawanie elementów interfejsu użytkownika przy użyciu pakietów VSPackage
- Tabela poleceń programu Visual Studio (pliki Vsct)
- Odwołanie do schematu XML VSCT
- VMSDK — przykład diagramów obwodów. Rozbudowane dostosowywanie DSL