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:
Deklarovat příkaz v Commands.vsct
Aktualizovat číslo verze balíčku v Package.tt.Je nutné provést při každé změně Commands.vsct
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:
Chcete definovat příkazy v nabídkách než v místní nabídce klepněte pravým tlačítkem myši.
Chcete-li definovat specifické seskupení příkazy v nabídce.
Chcete povolit ostatním uživatelům rozšířit DSL s vlastní příkazy.
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
V Aplikaci Solution Explorerpod DslPackage projektu, otevřete Commands.vsct.
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.
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>
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>
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.
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
V Aplikaci Solution Explorerv DslPackage v projektu GeneratedCode složky, otevřete soubor Package.tt.
Vyhledejte ProvideMenuResource atributu.
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
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 : ...
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.
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.
Rozšíř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ů.
Definujte, 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ě.
Definovat 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.
Zaregistrovat 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
Na Aplikaci Solution Explorer panel nástrojů, klepněte na tlačítko Transformace všechny šablony.
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í.
Experimentální sestavení otevřete ukázkový diagram.
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