Porady: dodawanie polecenia do menu skrótów
Tak, aby użytkownicy mogą wykonywać zadania, specyficzne dla swojej DSL, możesz dodać poleceń menu do języka specyficznego dla domeny (DSL).Polecenie ukażą się w menu kontekstowym (skrót) po kliknięciu prawym przyciskiem myszy diagramu.Polecenie można zdefiniować tak, aby pojawia się tylko w menu w określonych przypadkach.Na przykład można dokonać polecenie widoczny tylko wtedy, gdy użytkownik kliknie przycisk określone typy elementu lub elementów w określonej Stany.
Podsumowanie, są wykonywane czynności w projekcie DslPackage w następujący sposób:
Polecenie w Commands.vsct deklarować
Aktualizuj numer wersji pakietu w Package.tt.Masz w tym celu zmianie Commands.vsct
Pisanie metod w klasie CommandSet zwiększyć polecenia i aby zdefiniować elementy wykonaj polecenie.
Przykłady, patrz temat wizualizacji i modelowania SDK witryny sieci Web.
[!UWAGA]
Można również modyfikować zachowanie niektórych istniejących poleceń, takich jak Wytnij, Wklej, zaznacz wszystko i Drukuj przez zastąpienie metody w CommandSet.cs.Aby uzyskać więcej informacji, zobacz Porady: modyfikowanie standardowego polecenia menu w języku specyficznym dla domeny.
Definiowanie polecenia za pomocą MEF
Zarządzane rozszerzenia Framework (MEF) zapewnia alternatywną metodę definiowania poleceń menu w menu diagramu.Jego podstawowym celem jest umożliwienie DSL rozszerzyć przez użytkownika lub przez inne strony.Użytkownicy, można wybrać opcję zainstalowania tylko DSL lub można zainstalować DSL i rozszerzenia.MEF zmniejsza również zdefiniowanie poleceń menu skrótów, po początkowej pracy w celu włączenia MEF na DSL pracę.
Użyj metody w tym temacie:
Chcesz zdefiniować poleceń menu innych niż menu skrótów kliknij prawym przyciskiem myszy.
Należy zdefiniować określonych grup poleceń w menu.
Czy chcesz umożliwić innym rozszerzyć DSL z ich własnych poleceń.
Należy zdefiniować co polecenia.
W przeciwnym razie należy wziąć pod uwagę przy użyciu metody MEF do definiowania poleceń.Aby uzyskać więcej informacji, zobacz Rozszerzanie DSL za pomocą MEF.
Polecenie w Commands.Vsct deklarować
Polecenia zostały zadeklarowane w DslPackage\Commands.vsct.Te definicje Określ etykiety pozycji menu i których są wyświetlane w menu.
Plik, który zostanie zmodyfikowany, Commands.vsct, importuje definicje z kilka plików .h, które znajdują się w katalogu ścieżka instalacji programu Visual Studio SDK\VisualStudioIntegration\Common\Inc.Zawiera również GeneratedVsct.vsct, wygenerowana z definicję DSL.
Aby uzyskać więcej informacji o plikach .vsct, zobacz Visual Studio polecenia Tabela (.Pliki Vsct).
Aby dodać polecenie
W Eksploratora rozwiązań, w obszarze DslPackage projektu, otwórz Commands.vsct.
W Commands elementu, zdefiniuj co najmniej jeden przycisków i grupy.Element przycisk elementu menu.Element grupy jest sekcja w menu.Aby zdefiniować te elementy, należy dodać następujące elementy:
<!-- 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>
[!UWAGA]
Każdy przycisk lub grupy jest identyfikowane przez identyfikator GUID i liczby całkowitej.Z tego samego identyfikatora GUID, można utworzyć kilka grup i przyciski.Jednak muszą mieć różne identyfikatory.Identyfikator GUID nazwy i Identyfikatora nazwy są przetłumaczone rzeczywiste identyfikatory GUID oraz identyfikatory numeryczne w < symboli > węzła.
Dodaj ograniczenie widoczności dla polecenia, tak, aby została załadowana tylko w kontekście języka specyficznego dla domeny.Aby uzyskać więcej informacji, zobacz VisibilityConstraints Element.
W tym celu należy dodać następujące elementy w CommandTable elementu po Commands elementu.
<VisibilityConstraints> <!-- Ensures the command is only loaded for this DSL --> <VisibilityItem guid="guidCustomMenuCmdSet" id="cmdidMyContextMenuCommand" context="guidEditor"/> </VisibilityConstraints>
Definiowanie nazw, których można użyć w celu identyfikatory GUID oraz identyfikatory.W tym celu należy dodać Symbols elementu w CommandTable elementu 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>
Zastąp {000...000} z identyfikatorem GUID, który identyfikuje elementy menu i grupy.Aby uzyskać nowy identyfikator GUID, należy użyć utworzyć identyfikatora GUID narzędzie na narzędzia menu.
[!UWAGA]
Po dodaniu więcej grupy lub elementy menu, można użyć tego samego identyfikatora GUID.Musi jednak używać nowe wartości dla IDSymbols.
W kodzie skopiowanych z tej procedury należy zastąpić każde wystąpienie następujących ciągów własne parametry:
grpidMyMenuGroup
cmdidMyContextMenuCommand
guidCustomMenuCmdSet
Moje polecenie z Menu kontekstowego
Aktualizacja wersji pakietu w Package.tt
Zawsze, gdy dodać lub zmienić polecenie, zaktualizuj version parametru ProvideMenuResourceAttribute którego jest stosowane do klasy pakietu przed udostępnieniem nowej wersji języka specyficznego dla domeny.
Ponieważ klasa pakietu jest zdefiniowana w wygenerowanym pliku, zaktualizuj atrybut w pliku szablonu tekstowego, który generuje plik Package.cs.
Aby zaktualizować pliku Package.tt
W Eksploratora rozwiązań, w DslPackage projektu w GeneratedCode folderu, otwórz plik Package.tt.
Zlokalizuj ProvideMenuResource atrybutu.
Przyrost version parametr atrybutu, który jest drugim parametrem.Jeśli chcesz, może zapisywać Nazwa parametru jawnie do przypomnienia o z przeznaczeniem.Na przykład:
[VSShell::ProvideMenuResource("1000.ctmenu", version: 2 )]
Definiuje zachowanie polecenia
Twoje DSL ma już niektóre polecenia, które są wykonywane w klasie częściowe, którym jest zadeklarowany w DslPackage\GeneratedCode\CommandSet.cs.Aby dodać nowe polecenia, należy rozszerzyć tej klasy przez utworzenie nowego pliku zawierającego częściowa deklaracja tego samego rodzaju.Nazwa klasy jest zwykle < YourDslName >CommandSet.Warto zacząć od sprawdzania nazwę klasy i badanie jego zawartość.
Klasa zestaw poleceń jest tworzony na podstawie CommandSet.
Rozszerzenie klasy CommandSet
W Eksploratorze rozwiązań w projekcie DslPackage Otwórz GeneratedCode folder, a następnie Szukaj w obszarze CommandSet.tt i otwórz jego wygenerowany plik CommandSet.cs.Należy zauważyć, przestrzeń nazw i nazwę klasy pierwszy, zdefiniowany istnieje.Na przykład może zostać wyświetlony:
namespace Company.Language1
{ ... internal partial class Language1CommandSet : ...
W DslPackage, Utwórz folder o nazwie kodu niestandardowego.W tym folderze, należy utworzyć nowy plik klasy o nazwie CommandSet.cs.
W nowym pliku zapisu częściowe oświadczenie z tej samej przestrzeni nazw i nazwę jako wygenerowana klasa częściowe.Na przykład:
namespace Company.Language1 /* Make sure this is correct */
{ internal partial class Language1CommandSet { ...
Uwaga Jeżeli szablonu klasy został użyty do utworzenia nowego pliku, należy usunąć zarówno przestrzeń nazw i nazwę klasy.
Rozszerzenie klasy polecenia Set
Polecenie kod zestaw zwykle musi zaimportować następujących przestrzeni nazw:
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;
Dostosuj przestrzeń nazw i nazwę klasy do odpowiadają identyfikatorom w wygenerowanym CommandSet.cs:
namespace Company.Language1 /* Make sure this is correct */
{
// Same class as the generated class.
internal partial class Language1CommandSet
{
Należy zdefiniować dwie metody je, aby określić, kiedy polecenie będzie widoczny w menu kontekstowego, a drugi do wykonania polecenia.Te metody nie są zastąpienia; Zamiast tego należy zarejestrować je w listę poleceń.
Zdefiniuj, kiedy polecenie będzie widoczna
Dla każdego polecenia, należy zdefiniować OnStatus... metody, która określa, czy polecenie będą wyświetlane w menu i określa, czy zostanie włączone, czy szaro.Ustaw Visible i Enabled właściwości MenuCommand, jak pokazano w następującym przykładzie.Ta metoda jest wywoływana w celu skonstruowania menu skrótów za każdym razem, kiedy użytkownik prawym przyciskiem myszy, diagramu, więc musi działać szybko.
W tym przykładzie polecenie jest widoczny tylko wtedy, gdy użytkownik wybrał określonego typu kształtu i jest włączony tylko wtedy, gdy co najmniej jeden z wybranych elementów w określonym stanie.Przykład jest oparty na szablonie klasy diagramu DSL i ClassShape i ModelClass są typy, które są definiowane w 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
} } } }
Następujące fragmenty są często przydatne w przypadku metod OnStatus:
this.CurrentSelection.Kształt będący użytkownik kliknął prawym przyciskiem myszy zawsze znajduje się na tej liście.Gdy użytkownik kliknie pustą część diagramu, diagramu jest jedynym członkiem listy.
this.IsDiagramSelected() - trueKiedy użytkownik kliknie pustą część diagramu.
this.IsCurrentDiagramEmpty()
this.IsSingleSelection()-użytkownik nie zaznaczono wiele obiektów
this.SingleSelection-kształt lub diagram, z którym użytkownik kliknął prawym przyciskiem myszy
shape.ModelElement as MyLanguageElement-element modelu reprezentowany przez kształt.
Jako wytyczne ogólne, należy Visible są zależne od wybranej właściwości i upewnij Enabled właściwości są zależne od stanu wybranych elementów.
Metoda OnStatus nie należy zmieniać stan magazynu.
Zdefiniuj działanie polecenia
Dla każdego polecenia, należy zdefiniować OnMenu... metody, która wykonuje akcję wymagane, kiedy użytkownik kliknie polecenie menu.
Jeśli wprowadzisz zmiany do elementów modelu, należy je w transakcji.Aby uzyskać więcej informacji, zobacz Porady: modyfikowanie standardowego polecenia menu w języku specyficznym dla domeny.
W tym przykładzie ClassShape, ModelClass, i Comment typów zdefiniowanych w DSL, w którym jest tworzony na podstawie szablonu klasy diagramu DSL.
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!
}
}
Aby uzyskać więcej informacji o sposobie przejść z obiektu do obiektu w modelu i o tworzeniu obiektów oraz łącza, zobacz Porady: modyfikowanie standardowego polecenia menu w języku specyficznym dla domeny.
Zarejestruj się w poleceniu
Powtórz w języku C# deklaracje identyfikator GUID i identyfikator wartości wprowadzone w sekcji symbole CommandSet.vsct:
private Guid guidCustomMenuCmdSet =
new Guid("00000000-0000-0000-0000-000000000000");
private const int grpidMyMenuGroup = 0x01001;
private const int cmdidMyContextMenuCommand = 1;
Użycie tej samej wartości identyfikatora GUID wstawiony w Commands.vsct.
[!UWAGA]
Jeśli wprowadzisz zmiany w sekcji symboli pliku VSCT, należy zmienić te deklaracje do dopasowania.Należy także zwiększyć numer wersji w Package.tt
W ramach tego zestawu polecenie, należy zarejestrować poleceń menu.GetMenuCommands()jest wywoływana, gdy po zainicjowaniu 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;
}
Testowanie polecenia
Tworzenie i uruchamianie DSL w wystąpieniu doświadczalnych programu Visual Studio.Polecenie mają pojawiać się w menu skrótów w sytuacjach, które określono.
Wykonywanie polecenia
Na Eksploratora rozwiązań narzędzi, kliknij przycisk Transform wszystkie szablony.
Naciśnij klawisz F5 odbudowy to rozwiązanie i rozpocząć debugowanie języka specyficznego dla domeny w doświadczalnych kompilacji.
Kompilacja doświadczalnych Otwórz przykładowego diagramu.
Kliknij prawym przyciskiem myszy różnych elementów diagramu Sprawdź, czy polecenie jest prawidłowo włączony lub wyłączony i odpowiednio wyświetlane lub ukryte, w zależności od wybranego elementu.
Rozwiązywanie problemów
W menu nie ma polecenia:
Polecenie pojawi się tylko wtedy, gdy debugowanie wystąpień programu Visual Studio, dopóki nie zostanie zainstalowany pakiet DSL.Aby uzyskać więcej informacji, zobacz Wdrażanie rozwiązań dla języka specyficznego dla domeny.
Upewnij się, że doświadczalnych przykładu ma prawidłowe rozszerzenie dla tego DSL.Aby sprawdzić rozszerzenia nazwy pliku, otwórz DslDefinition.dsl w głównym wystąpienie programu Visual Studio.Następnie w Eksploratorze DSL, kliknij prawym przyciskiem myszy węzeł edytor, a następnie kliknij polecenie Właściwości.W oknie dialogowym właściwości należy sprawdzić, czy właściwość Rozszerzenie_pliku.
Czy zwiększyć numer wersji pakietu?
Ustaw punkt przerwania na początku metodę OnStatus.Powinna ona dzielone po kliknięciu prawym przyciskiem myszy nad dowolnym częścią diagramu.
Nie jest wywoływana metoda OnStatus:
Upewnij się, że identyfikatory GUID oraz identyfikatory w kodzie CommandSet odpowiadają identyfikatorom w sekcji symbole Commands.vsct.
Commands.vsct upewnij się, że identyfikator GUID i identyfikator w każdym węźle nadrzędnym identyfikacji prawidłowego obiektu nadrzędnego grupy.
W wierszu polecenia programu Visual Studio wpisz /setup oczekiwane /rootsuffix devenv.Następnie ponownie uruchom wystąpienie debugowania programu Visual Studio.
Kroku metodą OnStatus można zweryfikować tego polecenia.Visible i polecenia.Włączone są ustawione na wartość true.
Zostanie wyświetlone menu niewłaściwy tekst lub polecenie pojawia się w niewłaściwym miejscu:
Upewnij się, że kombinacja identyfikator GUID i identyfikator jest unikatowy dla tego polecenia.
Upewnij się, że zostały odinstalowane wcześniejszych wersji pakietu.
Zobacz też
Koncepcje
Porady: modyfikowanie standardowego polecenia menu w języku specyficznym dla domeny
Wdrażanie rozwiązań dla języka specyficznego dla domeny
Inne zasoby
Pisanie kodu pod kątem dostosowywania języka specyficznego dla domeny