Sdílet prostřednictvím


Úprava příkazu standardní nabídky v jazyce specifickém pro doménu

Chování některých standardních příkazů, které jsou definovány automaticky v DSL, můžete upravit. Můžete například upravit příkaz Vyjmout tak, aby vyloučil citlivé informace. Uděláte to tak, že přepíšete metody ve třídě sady příkazů. Tyto třídy jsou definovány v souboru CommandSet.cs v projektu DslPackage a jsou odvozeny z CommandSet.

Poznámka:

Pokud chcete vytvořit vlastní příkazy nabídky, přečtěte si článek Postupy: Přidání příkazu do místní nabídky.

Jaké příkazy můžete upravit?

Zjištění příkazů, které můžete upravit

  1. DslPackage V projektu otevřete GeneratedCode\CommandSet.cs. Tento soubor jazyka C# najdete v Průzkumník řešení jako dceřiná společnost CommandSet.tt.

  2. V tomto souboru vyhledejte třídy, jejichž názvy končí například "CommandSet", a Language1ClipboardCommandSetLanguage1CommandSet .

  3. V každé třídě sady příkazů zadejte "override" následované mezerou. IntelliSense zobrazí seznam metod, které můžete přepsat. Každý příkaz má dvojici metod, jejichž názvy začínají "ProcessOnStatus" a "ProcessOnMenu".

  4. Všimněte si, která z tříd sady příkazů obsahuje příkaz, který chcete upravit.

  5. Zavřete soubor bez uložení úprav.

    Poznámka:

    Obvykle byste neměli upravovat soubory, které byly vygenerovány. Všechny úpravy budou ztraceny při příštím vygenerování souborů.

Rozšíření příslušné třídy sady příkazů

Vytvořte nový soubor, který obsahuje částečnou deklaraci třídy sady příkazů.

Rozšíření třídy Command Set

  1. V Průzkumník řešení v projektu DslPackage otevřete složku GeneratedCode a pak se podívejte do CommandSet.tt a otevřete jeho vygenerovaný soubor CommandSet.cs. Poznamenejte si obor názvů a název první třídy, která je tam definována. Může se například zobrazit:

    namespace Company.Language1

    { ... internal partial class Language1CommandSet : ...

  2. V DslPackage vytvořte složku s názvem Custom Code. V této složce vytvořte nový soubor třídy s názvem CommandSet.cs.

  3. V novém souboru zapište částečnou deklaraci, která má stejný obor názvů a název jako vygenerovaná částečná třída. Příklad:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.Design;
    namespace Company.Language1 /* Make sure this is correct */
    { internal partial class Language1CommandSet { ...
    

    Poznámka:

    Pokud jste k vytvoření nového souboru použili šablonu souboru třídy, musíte opravit obor názvů i název třídy.

Přepsání metod příkazů

Většina příkazů má dvě přidružené metody: metoda s názvem, jako je ProcessOnStatus... určuje, zda má být příkaz viditelný a povolený. Volá se pokaždé, když uživatel klikne pravým tlačítkem myši na diagram a měl by rychle spustit a provádět žádné změny. ProcessOnMenu... je volána, když uživatel klikne na příkaz a měl by provést funkci příkazu. Možná budete chtít přepsat jednu nebo obě tyto metody.

Změna, když se příkaz zobrazí v nabídce

Přepsat ProcessOnStatus... Metoda. Tato metoda by měla nastavit vlastnosti Visible a Enabled parametru MenuCommand. Obvykle se na to příkaz podívá. CurrentSelection k určení, zda se příkaz vztahuje na vybrané prvky, a může se také podívat na jejich vlastnosti a určit, zda lze příkaz použít v aktuálním stavu.

Obecně platí, že vlastnost Visible by měla být určena vybranými prvky. Vlastnost Enabled, která určuje, zda má být příkaz v nabídce černý nebo šedý, by měl záviset na aktuálním stavu výběru.

Následující příklad zakáže položku nabídky Odstranit, pokud uživatel vybral více než jeden obrazec.

Poznámka:

Tato metoda nemá vliv na to, zda je příkaz k dispozici prostřednictvím stisknutí klávesy. Zakázání položky nabídky Odstranit například nezabrání vyvolání příkazu pomocí klávesy Delete.

/// <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;
  }
}

Je vhodné nejprve volat základní metodu, abyste se zabývali všemi případy a nastaveními, se kterými nejste znepokojeni.

Metoda ProcessOnStatus by neměla vytvářet, odstraňovat nebo aktualizovat elementy ve Storu.

Změna chování příkazu

Přepsat ProcessOnMenu... Metoda. Následující příklad zabrání uživateli odstranit více prvků najednou, a to i pomocí klávesy Delete.

/// <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();
  }
}

Pokud váš kód provede změny ve Storu, jako je například vytváření, odstraňování nebo aktualizace prvků nebo odkazů, musíte to udělat uvnitř transakce. Další informace naleznete v tématu Vytvoření a aktualizace prvků modelu.

Napsání kódu metod

Následující fragmenty jsou často užitečné v těchto metodách:

  • this.CurrentSelection. Obrazec, na který uživatel klikl pravým tlačítkem, je vždy součástí tohoto seznamu obrazců a spojnic. Pokud uživatel klikne na prázdnou část diagramu, je diagram jediným členem seznamu.

  • this.IsDiagramSelected() - true pokud uživatel kliknul na prázdnou část diagramu.

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection() – uživatel nevybere více obrazců.

  • this.SingleSelection – obrazec nebo diagram, na který uživatel klikl pravým tlačítkem

  • shape.ModelElement as MyLanguageElement – prvek modelu reprezentovaný obrazcem.

Další informace o tom, jak přejít z elementu na element a jak vytvořit objekty a odkazy, naleznete v tématu Navigace a aktualizace modelu v kódu programu.