Sdílet prostřednictvím


Jak: přidat příkaz místní nabídky

Příkazy nabídky můžete přidat do domény specifické pro jazyk (DSL), takže uživatelé mohou provádět úkoly, které jsou specifické pro vaše DSL.Příkazy se zobrazují v nabídce kontextu (zástupce), při klepnutí pravým tlačítkem na diagramu.Příkaz můžete definovat tak, aby se zobrazí pouze v nabídce za zvláštních okolností.Například provedete příkaz viditelné pouze v případě, že uživatel klepne na určité typy element nebo elementy v určitých státech.

V souhrnu kroky jsou prováděny v projektu DslPackage takto:

  1. Deklarovat příkaz v Commands.vsct

  2. Aktualizovat číslo verze balíčku v Package.tt.Je nutné provést při každé změně Commands.vsct

  3. Metody zápisu ve třídě CommandSet příkaz zviditelnit a definovat, co chcete provést příkaz.

Ukázky najdete webu vizualizaci a modelování SDK.

[!POZNÁMKA]

Můžete také změnit chování některých příkazů Vyjmout, vložit, vyberte všechny a tisk přepsáním metod v CommandSet.cs.Další informace naleznete v tématu Jak: změna standardní příkaz v jazyce specifické pro doménu.

Definování příkazu pomocí MEF

Spravované rozšíření Framework (MEF) umožňuje definování příkazů v nabídce diagramu.Jeho primárním účelem je umožnit DSL prodloužit vámi nebo jiným stranám.Uživatelům můžete nainstalovat pouze DSL nebo nainstalovat rozšíření i DSL.MEF však snižuje práce definování příkazů místní nabídky po počáteční pracovní povolení MEF na modem DSL.

V tomto tématu použijte metodu, pokud:

  1. Chcete definovat příkazy v nabídkách než v místní nabídce klepněte pravým tlačítkem myši.

  2. Chcete-li definovat specifické seskupení příkazy v nabídce.

  3. Chcete povolit ostatním uživatelům rozšířit DSL s vlastní příkazy.

  4. Chcete definovat jeden příkaz.

Jinak zvažte použití metody MEF definovat příkazy.Další informace naleznete v tématu Rozšířit vaše DSL pomocí MEF.

Deklarovat příkaz v Commands.Vsct

Příkazy nabídky jsou deklarovány v DslPackage\Commands.vsct.Tyto definice Určete popisky položek nabídky a jejich umístění v nabídkách.

Soubor, který upravujete, Commands.vsct, definice dovozy z několika soubor s příponou h soubory, které jsou umístěny v adresáři Visual Studio SDK Instalační cesta\VisualStudioIntegration\Common\Inc.Obsahuje také GeneratedVsct.vsct, vygenerovaná z DSL definition.

Další informace o .vsct soubory, viz Tabulka příkazu Visual Studio (.Soubory Vsct).

Přidat příkaz

  1. V Aplikaci Solution Explorerpod DslPackage projektu, otevřete Commands.vsct.

  2. V Commands prvek, definovat jeden nebo více tlačítek a skupiny.A tlačítko je položka v nabídce.A skupiny části nabídky.Chcete-li definovat tyto položky přidáte následující prvky:

    <!-- Define a group - a section in the menu -->
    <Groups>
      <Group guid="guidCustomMenuCmdSet" id="grpidMyMenuGroup" priority="0x0100">
        <!-- These symbols are defined in GeneratedVSCT.vsct -->
        <Parent guid="guidCmdSet" id="menuidContext" />
      </Group>
    </Groups>
    <!-- Define a button - a menu item - inside the Group -->
    <Buttons>
      <Button guid="guidCustomMenuCmdSet" id="cmdidMyContextMenuCommand"
        priority="0x0100" type="Button">
        <Parent guid="guidCustomMenuCmdSet" id="grpidMyMenuGroup"/>
        <!-- If you do not want to place the command in your own Group, 
             use Parent guid="guidCmdSet" id="grpidContextMain".
             These symbols are defined in GeneratedVSCT.vsct -->
        <CommandFlag>DynamicVisibility</CommandFlag>
        <Strings>
          <ButtonText>My Context Menu Command</ButtonText>
        </Strings>
      </Button>
    </Buttons>
    

    [!POZNÁMKA]

    Každé tlačítko nebo skupiny je identifikován identifikátor GUID a celé číslo ID.Můžete vytvořit několik skupin a tlačítka se stejným identifikátorem GUID.Musí však mít různé identifikátory.Názvy GUID a ID názvy jsou převedeny na skutečné identifikátory GUID a číselné ID v <Symbols> uzel.

  3. Omezení viditelnosti pro příkaz přidáte, takže je načten pouze v rámci domény specifické pro jazyk.Další informace naleznete v tématu Prvek VisibilityConstraints.

    Chcete-li to provést, přidejte následující prvky CommandTable prvek po Commands prvku.

    <VisibilityConstraints>
      <!-- Ensures the command is only loaded for this DSL -->
      <VisibilityItem guid="guidCustomMenuCmdSet" id="cmdidMyContextMenuCommand"
        context="guidEditor"/>
    </VisibilityConstraints>
    
  4. Definujte názvy, které používají pro identifikátory GUID a ID.To lze provést přidáním Symbols prvek CommandTable prvek po Commands prvku.

    <Symbols>
      <!-- Substitute a unique GUID for the placeholder: -->
      <GuidSymbol name="guidCustomMenuCmdSet"
        value="{00000000-0000-0000-0000-000000000000}" >
        <IDSymbol name="grpidMyMenuGroup" value="0x01001"/>
        <IDSymbol name="cmdidMyContextMenuCommand" value="0x00001"/>
      </GuidSymbol>
    </Symbols>
    
  5. Nahradit {000...000} s identifikátorem GUID, který identifikuje, skupiny a položky nabídek.Chcete-li získat nový identifikátor GUID, použijte Vytvořte identifikátor GUID nástroj Nástroje nabídce.

    [!POZNÁMKA]

    Pokud přidáte více skupin nebo položky nabídky, můžete použít stejný identifikátor GUID.Však musí používat nové hodnoty IDSymbols.

  6. V kódu, který jste zkopírovali z tohoto postupu nahraďte všechny výskyty řetězce následující vlastní řetězce:

    • grpidMyMenuGroup

    • cmdidMyContextMenuCommand

    • guidCustomMenuCmdSet

    • Moje kontextu příkazu nabídky

Aktualizace verze balíčku v Package.tt

Při každém přidání nebo změna příkazu Aktualizovat version parametr ProvideMenuResourceAttribute , použita třída balíčku před uvolněním novou verzi domény specifické pro jazyk.

Protože třída balíčku je definována ve vytvořeném souboru, aktualizujte atribut v souboru šablony text, který generuje soubor Package.cs.

Aktualizace souboru Package.tt

  1. V Aplikaci Solution Explorerv DslPackage v projektu GeneratedCode složky, otevřete soubor Package.tt.

  2. Vyhledejte ProvideMenuResource atributu.

  3. Přírůstek version parametr atribut, který je druhý parametr.Pokud chcete, můžete napsat název parametru výslovně na to upozorní svůj účel.Příklad:

    [VSShell::ProvideMenuResource("1000.ctmenu", version: 2 )]

Definování chování příkazu

Některé příkazy, které jsou implementovány v částečné třídy, která je deklarována v DslPackage\GeneratedCode\CommandSet.cs již vaše DSL.Chcete-li přidat nové příkazy je třeba rozšířit vytvořením nového souboru, který obsahuje částečné prohlášení stejné třídy této třídy.Název třídy je obvykle <YourDslName>CommandSet.Je vhodné začít název třídy, ověřování a kontroly jeho obsah.

Třída příkaz set je odvozen od CommandSet.

Rozšíření třídy CommandSet

  1. V aplikaci Solution Explorer DslPackage projektu otevřete složku GeneratedCode a ve skupinovém rámečku CommandSet.tt a otevřete jeho vygenerovaný soubor CommandSet.cs.Poznámka: obor názvů a název první třídy, která je v ní definována.Může například zobrazit:

    namespace Company.Language1

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

  2. V DslPackage, vytvořte složku s názvem vlastní kód.V této složce vytvořte třídu soubor s názvem CommandSet.cs.

  3. V novém souboru zapište částečné prohlášení, že má stejný obor názvů a název generovaný částečné třídy.Příklad:

    namespace Company.Language1 /* Make sure this is correct */

    { internal partial class Language1CommandSet { ...

    Poznámka: Pokud šablona třídy vytvořit nový soubor, musíte opravit obor názvů a název třídy.

Dd820681.collapse_all(cs-cz,VS.110).gifRozšíření třídy příkaz Set

Kód příkazu set obvykle potřeba importovat následující obory:

using System;
using System.Collections.Generic;
using System.ComponentModel.Design; 
using System.Linq;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
using Microsoft.VisualStudio.Modeling.Shell;

Nastavte obor názvů a název třídy, aby odpovídalo v generované CommandSet.cs:

namespace Company.Language1 /* Make sure this is correct */
{
  // Same class as the generated class.
  internal partial class Language1CommandSet 
  {

Máte dvě metody, jeden určit, kdy bude zobrazeno v místní nabídce a druhý k provedení příkazu příkaz definovat.Tyto metody nejsou lokální změny; místo toho můžete zaregistrovat v seznamu příkazů.

Dd820681.collapse_all(cs-cz,VS.110).gifDefinujte, kdy bude zobrazen příkaz

Každý příkaz definovat OnStatus... metoda, která určuje, zda bude příkaz v nabídce zobrazen, a zda bude povolena nebo šedě.Nastavit Visible a Enabled vlastnosti MenuCommand, jak ukazuje následující příklad.Tato metoda je volána pro konstrukci pokaždé, když uživatel klepne v diagramu musí rychle pracovat v místní nabídce.

V tomto příkladu příkaz je viditelné pouze v případě, že uživatel vybral určitý typ obrazce a je povoleno pouze pokud alespoň jeden z vybraných prvků v určitém stavu.V příkladu je založen na šabloně DSL diagramu třídy a typy, které jsou definovány v modem DSL jsou ClassShape a ModelClass:

private void OnStatusMyContextMenuCommand(object sender, EventArgs e)
{
  MenuCommand command = sender as MenuCommand;
  command.Visible = command.Enabled = false;
  foreach (object selectedObject in this.CurrentSelection)
  {
    ClassShape shape = selectedObject as ClassShape;
    if (shape != null)
    {
      // Visibility depends on what is selected.
      command.Visible = true;
      ModelClass element = shape.ModelElement as ModelClass;
      // Enabled depends on state of selection.
      if (element != null && element.Comments.Count == 0)
      {
        command.Enabled = true;
        return; // seen enough
} } } }

Následující fragmenty jsou často užitečné metody OnStatus:

  • this.CurrentSelection.Tvar, který uživatel klepli pravým tlačítkem myši je vždy součástí tohoto seznamu.Pokud uživatel klepne na prázdnou část diagramu, diagramu je jediný člen seznamu.

  • this.IsDiagramSelected() - truePokud by uživatel klepnul na prázdnou část diagramu.

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection()-uživatel nevybrali více objektů

  • this.SingleSelection-tvar nebo diagram, který uživatel klepli pravým tlačítkem myši

  • shape.ModelElement as MyLanguageElement-prvek modelu zastoupena obrazcem.

Jako obecné vodítko, aby Visible závisejí na vybrané vlastnosti a ujistěte Enabled vlastnosti závisí na stavu vybrané prvky.

Metodu OnStatus neměli měnit stav úložiště.

Dd820681.collapse_all(cs-cz,VS.110).gifDefinovat neobsahuje příkaz

Každý příkaz definovat OnMenu... metoda, která provádí požadovaná akce po klepnutí na příkaz nabídky.

Pokud provedete změny prvky modelu, musíte tak učinit uvnitř transakce.Další informace naleznete v tématu Jak: změna standardní příkaz v jazyce specifické pro doménu.

V tomto příkladu ClassShape, ModelClass, a Comment jsou typy, které jsou definovány v DSL je odvozen ze šablony Diagram DSL třídy.

private void OnMenuMyContextMenuCommand(object sender, EventArgs e)
{
  MenuCommand command = sender as MenuCommand;
  Store store = this.CurrentDocData.Store;
  // Changes to elements and shapes must be performed in a Transaction.
  using (Transaction transaction =
       store.TransactionManager.BeginTransaction("My command"))
  {
    foreach (object selectedObject in this.CurrentSelection)
    {
      // ClassShape is defined in my DSL.
      ClassShape shape = selectedObject as ClassShape;
      if (shape != null)
      {
        // ModelClass is defined in my DSL.
        ModelClass element = shape.ModelElement as ModelClass;
        if (element != null)
        {
          // Do required action here - for example:

          // Create a new element. Comment is defined in my DSL.
          Comment newComment = new Comment(element.Partition);
          // Every element must be the target of an embedding link.
          element.ModelRoot.Comments.Add(newComment);
          // Set properties of new element.
          newComment.Text = "This is a comment";
          // Create a reference link to existing object.
          element.Comments.Add(newComment);
        }
      }
    }
    transaction.Commit(); // Don't forget this!
  }
}

Další informace o tom, jak přejít z objektů v modelu a jak vytvořit objekty a propojení, viz Jak: změna standardní příkaz v jazyce specifické pro doménu.

Dd820681.collapse_all(cs-cz,VS.110).gifZaregistrovat příkaz

Opakujte prohlášení provedené v části symboly CommandSet.vsct hodnoty identifikátoru GUID a ID v jazyce C#:

    private Guid guidCustomMenuCmdSet = 
        new Guid("00000000-0000-0000-0000-000000000000");
    private const int grpidMyMenuGroup = 0x01001;
    private const int cmdidMyContextMenuCommand = 1;

Použijte stejnou hodnotu identifikátoru GUID jako vložené do Commands.vsct.

[!POZNÁMKA]

Části symboly VSCT souboru změníte, je nutné změnit tato prohlášení odpovídají.Měla také zvýšit číslo verze v Package.tt

Jako součást sady tento příkaz zaregistrujte vaše příkazy.GetMenuCommands()je volána jednou při inicializaci diagramu:

protected override IList<MenuCommand> GetMenuCommands()
{
  // Get the list of generated commands.
  IList<MenuCommand> commands = base.GetMenuCommands();
  // Add a custom command:
  DynamicStatusMenuCommand myContextMenuCommand =
    new DynamicStatusMenuCommand(
      new EventHandler(OnStatusMyContextMenuCommand),
      new EventHandler(OnMenuMyContextMenuCommand),
      new CommandID(guidCustomMenuCmdSet, cmdidMyContextMenuCommand));
  commands.Add(myContextMenuCommand);
  // Add more commands here.
  return commands;
} 

Testovat příkaz

Sestavit a spustit DSL v instanci experimentální Visual Studio.Zobrazí příkaz v místní nabídce v situacích, které jste zadali.

Vykonávat příkaz

  1. Na Aplikaci Solution Explorer panel nástrojů, klepněte na tlačítko Transformace všechny šablony.

  2. Stiskněte klávesu F5 znovu vytvořit řešení a spuštění ladění domény specifické pro jazyk v experimentální sestavení.

  3. Experimentální sestavení otevřete ukázkový diagram.

  4. Pravým tlačítkem myši na jednotlivé položky v diagramu, ověřte, že příkaz správně povolen nebo zakázán a vhodně zobrazený nebo skrytý, v závislosti na vybrané položky.

Poradce při potížích

Příkaz v nabídce nezobrazí:

  • Příkaz se zobrazí pouze v ladění instance aplikace Visual Studio, až po instalaci balíčku DSL.Další informace naleznete v tématu Zavedení řešení domény specifické pro jazyk.

  • Přesvědčte se, zda má správnou příponu názvu vaší experimentální vzorku pro toto připojení DSL.Chcete-li zkontrolovat příponu názvu souboru, otevřete v hlavní instance aplikace Visual Studio DslDefinition.dsl.V aplikaci Explorer DSL, klepněte pravým tlačítkem na uzel editoru a klepněte na příkaz Vlastnosti.V okně Vlastnosti zkontrolujte vlastnosti Přípona_názvu_souboru.

  • Obdrželi jste Přírůstek číslo verze balíčku?

  • Nastavte zarážku na začátku metodu OnStatus.Měla přerušit, když klepnete pravým tlačítkem na libovolnou část diagramu.

    Nebyla volána metoda OnStatus:

    • Ujistěte se, že identifikátory GUID a ID v CommandSet kódu shodují v části symboly Commands.vsct.

    • V Commands.vsct Přesvědčte se, zda identifikátor GUID a ID v každé nadřazeného uzlu určit správné nadřazené skupiny.

    • V aplikaci Visual Studio příkazového řádku zadejte devenv /rootsuffix exp /setup.Restartujte ladění instance aplikace Visual Studio.

  • Krokovat OnStatus metodu ověření daného příkazu.Viditelné a příkaz.Povolena jsou nastavena na hodnotu true.

Se zobrazí text nesprávné nabídce nebo příkazu se zobrazí na nesprávné místo:

  • Ujistěte se, že kombinací identifikátoru GUID a ID je jedinečný pro tento příkaz.

  • Zkontrolujte, zda odinstalovali předchozí verze balíčku.

Viz také

Koncepty

Jak: změna standardní příkaz v jazyce specifické pro doménu

Další zdroje

Zápis kódu nastavit domény specifické pro jazyk

Ukázkový kód: okruhů