Postupy: Přidání příkazu do místní nabídky
Příkazy nabídky můžete přidat do jazyka specifické pro doménu (DSL) tak, aby vaši uživatelé můžete provádět úlohy, 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 v zvláštní okolnosti.Například můžete provést příkaz viditelné pouze v případě, že uživatel klikne na určité druhy element nebo elementy v určité stavy.
V souhrnu kroky se provádí v projektu DslPackage následujícím způsobem:
Příkaz v Commands.vsct deklarovat
Aktualizovat číslo verze balíčku v Package.tt.Je třeba provést při každé změně Commands.vsct
Zapsat metody ve třídě CommandSet Chcete-li zobrazit příkaz a určete, co má příkaz, který má provést.
Ukázky najdete vizualizaci a modelování SDK web.
[!POZNÁMKA]
Můžete také změnit chování některé existující příkazy, například pro vyjmutí, vložení, Vybrat vše a tisk přepsáním metody v CommandSet.cs.Další informace naleznete v tématu Postupy: Úprava příkazu standardní nabídky v jazyce specifickém pro doménu.
Definování příkaz pomocí rozhraní MEF
Spravovaná rozšíření Framework (MEF) poskytuje alternativní metody definovat příkazy nabídky v nabídce diagramu.Chcete-li povolit DSL prodloužit vy nebo ostatní strany je jeho primárním účelem.Uživatele můžete nainstalovat pouze DSL nebo mohou nainstalovat DSL a rozšíření.MEF však také snižuje pracovní po počáteční prací, aby mohl MEF na DSL definovat příkazy místní nabídky.
Pomocí této metody v tomto tématu, pokud:
Chcete definovat příkazy v nabídkách než v místní nabídce klepněte pravým tlačítkem myši.
Chcete definovat konkrétní seskupení příkazů v nabídce.
Chcete-li povolit ostatním uživatelům rozšířit DSL s své vlastní příkazy nechcete.
Chcete definovat jeden příkaz.
Jinak zvažte použití metody MEF definovat příkazy.Další informace naleznete v tématu Rozšíření vašeho DSL pomocí MEF.
Příkaz v Commands.Vsct deklarovat
Příkazy nabídky jsou deklarovány v DslPackage\Commands.vsct.Tyto definice zadejte popisky položek nabídky a jejich umístění v nabídkách.
Importuje soubor, který můžete upravit, Commands.vsct, definice z několika hlaviček soubory, které jsou umístěny v adresáři Visual Studio SDK Instalační cesta\VisualStudioIntegration\Common\Inc.Zahrnuje také GeneratedVsct.vsct, vygenerovaná z DSL definition.
Další informace o souborech .vsct naleznete v tématu Tabulka příkazu Visual Studio (.Soubory Vsct).
Chcete-li přidat příkaz
V Průzkumníka řešenív části DslPackage projektu, otevřete Commands.vsct.
V Commands elementu, definujte jedno nebo více tlačítek a skupinou.Objekt tlačítko je položku v nabídce.Objekt skupiny je oddíl v nabídce.Chcete-li definovat tyto položky, přidejte 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 identifikátor celé číslo.Můžete vytvořit několik skupin a tlačítka s stejný identifikátor GUID.Však musí mít různé identifikátory.Identifikátor GUID názvy a ID názvy jsou přeložena na číselné ID v a skutečné identifikátory GUID < symboly > uzlu.
Přidáte omezení viditelnost pro příkaz, tak, aby je načten pouze v kontextu jazyce specifické pro doménu.Další informace naleznete v tématu Prvek VisibilityConstraints.
Chcete-li to provést, přidejte následující prvky v CommandTable element po Commands elementu.
<VisibilityConstraints> <!-- Ensures the command is only loaded for this DSL --> <VisibilityItem guid="guidCustomMenuCmdSet" id="cmdidMyContextMenuCommand" context="guidEditor"/> </VisibilityConstraints>
Definujte názvy, které můžete použít pro ID a identifikátory GUID.Chcete-li to provést, přidejte Symbols element v CommandTable element po Commands elementu.
<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átor GUID, který identifikuje skupiny a položky nabídky.Chcete-li získat nový identifikátor GUID, použijte vytvořit identifikátor GUID nástroj na nástroje nabídky.
[!POZNÁMKA]
Pokud chcete přidat další skupiny nebo položky nabídky, můžete použít stejný identifikátor GUID.Nicméně, je nutné použít nové hodnoty pro IDSymbols.
V kódu, který jste zkopírovali z tohoto postupu nahraďte každý výskyt následující řetězce vlastní řetězce:
grpidMyMenuGroup
cmdidMyContextMenuCommand
guidCustomMenuCmdSet
Příkaz nabídky mé kontextu
Aktualizace verze balíčku v Package.tt
Při každém přidání nebo změně příkazu, aktualizovat version parametru ProvideMenuResourceAttribute která je použita třída balíčku, před uvolněním nová verze jazyka vaše specifické pro doménu.
Vzhledem k tomu, že třída balíčku je definován ve vytvořeném souboru, aktualizace atributu v textovém souboru šablony, který generuje soubor Package.cs.
Chcete-li aktualizovat soubor Package.tt
V Průzkumníka řešenív DslPackage projekt v GeneratedCode složky, otevřete soubor Package.tt.
Vyhledejte ProvideMenuResource atributu.
Přírůstky version parametr pro atribut, který je druhý parametr.Pokud chcete, můžete napsat název parametru explicitně chcete upozorňovat na jeho účel.Příklad:
[VSShell::ProvideMenuResource("1000.ctmenu", version: 2 )]
Definovat chování příkazu
Vaše DSL již má některé příkazy, které jsou implementovány v dílčí třídu, která je deklarován v DslPackage\GeneratedCode\CommandSet.cs.Chcete-li přidat nové příkazy, je nutné rozšířit této třídy tak, že vytvoříte nový soubor, který obsahuje deklaraci částečné stejné třídy.Název třídy je obvykle < YourDslName >CommandSet.Je užitečný začněte tím, který ověřuje název třídy a kontrole jeho obsah.
Třída sady příkazu je odvozen od CommandSet.
Rozšíření třídy CommandSet
V Průzkumníku řešení v DslPackage projektu otevřete složku GeneratedCode a ve skupinovém rámečku CommandSet.tt a otevřete její vygenerovaný soubor CommandSet.cs.Poznámka: obor názvů a název třídy první, který je definován existuje.Například můžete uvidět:
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 nový soubor třídy s názvem CommandSet.cs.
V tomto novém souboru zapište částečná deklarace, který má stejný obor názvů a název jako generovaná třída částečné.Příklad:
namespace Company.Language1 /* Make sure this is correct */
{ internal partial class Language1CommandSet { ...
Poznámka: Pokud šablona třídy jste použili k vytvoření nového souboru, je nutné opravit obor názvů a název třídy.
Rozšiřují třídu příkaz nastavit
Příkaz kódu sady obvykle potřebovat k importu následujících oborů názvů:
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 pro vyhledání programů v generované CommandSet.cs:
namespace Company.Language1 /* Make sure this is correct */
{
// Same class as the generated class.
internal partial class Language1CommandSet
{
Je třeba definovat dvěma způsoby, jeden k určení, kdy bude příkaz v místní nabídce a jiných k provedení příkazu viditelná.Tyto metody nejsou přepsání; Místo toho zaregistrujte je v seznamu příkazů.
Definovat, kdy má být příkaz viditelné
Pro každý příkaz definovat OnStatus... metodu, která určuje, zda příkaz, který se zobrazí v nabídce a zda bude povoleno nebo v takovém případě nedostupné.Nastavte Visible a Enabled vlastnosti MenuCommand, jak je znázorněno v následujícím příkladu.Tato metoda je volána za účelem vytvoření pokaždé, když uživatel klikne pravým tlačítkem myši diagramu, proto musí pracovat rychle místní nabídky.
V tomto příkladu je příkaz viditelné pouze v případě, že uživatel vybral konkrétní typ tvaru a je povolen pouze v případě, že alespoň jeden z vybraných elementů je v určitém stavu.V příkladu je založen na šabloně DSL diagramu třídy a ClassShape a ModelClass jsou typy, které jsou definovány v DSL:
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é v OnStatus metod:
this.CurrentSelection.Obrazec, který klepli pravým tlačítkem myši uživatele je vždy zahrnuta v tomto seznamu.Pokud uživatel klikne na prázdnou část diagramu, diagramu, je jediným členem v seznamu.
this.IsDiagramSelected() - truePokud uživatel klikne na prázdnou část diagramu.
this.IsCurrentDiagramEmpty()
this.IsSingleSelection()-uživatel nevybírejte více objektů
this.SingleSelection-tvar nebo diagram, který klepli pravým tlačítkem myši uživatele
shape.ModelElement as MyLanguageElement-prvek modelu, která je reprezentována tvar.
Jako obecné vodítko, ujistěte Visible vlastnost závisí na co je vybráno a provést Enabled vlastnost závisí na stavu vybrané elementy.
Metodu OnStatus nesmí změnit stav úložiště.
Definovat, co příkaz, který umožňuje
Pro každý příkaz definovat OnMenu... metodu, která provádí požadovaná akce, když uživatel klikne příkaz nabídky.
Pokud změníte prvky modelu, musíte tak učinit v transakci.Další informace naleznete v tématu Postupy: Úprava příkazu standardní nabídky v jazyce specifickém pro doménu.
V tomto příkladu ClassShape, ModelClass, a Comment jsou typy, které jsou definovány v DSL, který je odvozen ze třídy diagramu DSL šablony.
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 objektu do objektu v modelu a o tom, jak vytvořit objekty a propojení naleznete v tématu Postupy: Úprava příkazu standardní nabídky v jazyce specifickém pro doménu.
Zaregistrujte se příkaz
Prohlášení o identifikátor GUID a ID hodnoty, které jste provedli v části symboly CommandSet.vsct se opakuje v jazyce C#:
private Guid guidCustomMenuCmdSet =
new Guid("00000000-0000-0000-0000-000000000000");
private const int grpidMyMenuGroup = 0x01001;
private const int cmdidMyContextMenuCommand = 1;
Použít stejnou hodnotu GUID, protože jste vložili v Commands.vsct.
[!POZNÁMKA]
Pokud změníte symboly část souboru VSCT, je nutné změnit tyto deklarace k porovnání.Také by se měl zvýšit číslo verze v Package.tt
Zaregistrujte svůj příkazy nabídky v rámci této sadu příkazů.GetMenuCommands()je volána poté, co 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
Vytvořit a spustit DSL v instanci pokusné sady Visual Studio.Příkaz, který se mají zobrazit v místní nabídce v situacích, které jste zadali.
Vykonávat příkaz
Na Průzkumníka řešení nástrojů, klepněte na tlačítko transformace všechny šablony.
Stiskněte klávesu F5 řešení znovu vytvořit a spustit ladění jazyk specifické pro doménu, ve pokusné sestavení.
V pokusné sestavení otevřete ukázkový diagram.
Klikněte pravým tlačítkem na různých položek do diagramu, chcete-li ověřit, že příkaz správně povoleno nebo zakázáno a vhodně zobrazený nebo skrytý, v závislosti na vybrané položky.
Poradce při potížích
V nabídce není zobrazen příkaz:
Příkaz, který se zobrazí pouze v ladění instance sady Visual Studio, dokud nebude nainstalován balíček DSL.Další informace naleznete v tématu Nasazování řešení jazyka specifického pro doménu.
Ujistěte se, že pokusné ukázku má pro tento DSL správnou příponu názvu souboru.Chcete-li zkontrolovat příponu názvu souboru, otevřete DslDefinition.dsl v hlavním instanci sady Visual Studio.V Průzkumníku DSL klikněte pravým tlačítkem na uzel Editor a poté klepněte na příkaz Vlastnosti.V okně Vlastnosti zkontrolujte vlastnost Přípona_názvu_souboru.
Nebyla vám zvýšit číslo verze balíčku?
Nastavení zarážky na začátku způsob OnStatus.Ji by mělo dojít při klepnutí pravým tlačítkem myši nad libovolnou část diagramu.
Není zavolána metoda OnStatus:
Ujistěte se, že ID ve vašem kódu CommandSet a identifikátory GUID odpovídají v části symboly Commands.vsct.
Commands.vsct Ujistěte se, že identifikátoru GUID a ID v každém nadřazený uzel identifikovat správný nadřazené skupiny.
Příkazový řádek sady Visual Studio zadejte devenv /rootsuffix exp /setup.Restartujte ladění instanci sady Visual Studio.
Krokovat OnStatus metodu za účelem ověření tohoto příkazu.Zobrazit a příkazu.Povolit jsou nastavena na hodnotu true.
Nesprávné nabídce text se zobrazí, nebo příkaz se zobrazí v nesprávném místě:
Ujistěte se, že kombinace identifikátor GUID a ID je jedinečné pro tento příkaz.
Ujistěte se, že odinstalaci dřívější verze balíčku.
Viz také
Koncepty
Postupy: Úprava příkazu standardní nabídky v jazyce specifickém pro doménu
Nasazování řešení jazyka specifického pro doménu