Udostępnij za pośrednictwem


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ć

  1. W projekcie DslPackage otwórz plik GeneratedCode\CommandSet.cs. Ten plik w języku C# można znaleźć w Eksplorator rozwiązań jako spółka zależna .CommandSet.tt

  2. Znajdź klasy w tym pliku, których nazwy kończą się ciągiem "CommandSet", na przykład Language1CommandSet i Language1ClipboardCommandSet.

  3. 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".

  4. Zwróć uwagę, które z klas zestawu poleceń zawiera polecenie, które chcesz zmodyfikować.

  5. 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ń

  1. 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 : ...

  2. W folderze DslPackage utwórz folder o nazwie Kod niestandardowy. W tym folderze utwórz nowy plik klasy o nazwie CommandSet.cs.

  3. 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ów

  • this.SingleSelection — kształt lub diagram, który użytkownik kliknął prawym przyciskiem myszy

  • shape.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.