Udostępnij za pośrednictwem


Jak: Dodawanie polecenia do Menu skrótów

Polecenia menu można dodać do języka specyficzne dla domeny (DSL), dzięki czemu użytkownicy mogą wykonywać zadania, które są specyficzne dla linii DSL.Polecenia są wyświetlane w menu kontekstowym (skrót) użytkownicy prawym przyciskiem myszy na diagramie.Polecenie można zdefiniować tak, aby tylko pojawi się w menu, w szczególnych okolicznościach.Na przykład istnieje możliwość polecenia widoczne tylko wtedy, gdy użytkownik kliknie element lub elementy w określonych Państwach określonych typów.

Podsumowując kroki wykonywane są w projekcie DslPackage w następujący sposób:

  1. Stwierdzenie polecenia w Commands.vsct

  2. Czy aktualizować numer wersji pakietu w Package.tt.Trzeba to zrobić przy każdej zmianie Commands.vsct

  3. Metod zapisu w klasie CommandSet polecenie stało się widoczne i określić, co ma wykonać polecenie.

Dla próbek, zobacz wizualizacji i modelowania SDK w witrynie sieci Web.

[!UWAGA]

Można również zmodyfikować zachowanie niektórych istniejących poleceń, takich jak Wytnij, Wklej, zaznacz wszystko i Drukuj przesłanianie metod w CommandSet.cs.Aby uzyskać więcej informacji, zobacz Jak: Modyfikowanie standardowego polecenia Menu w języku specyficzne dla domeny.

Określenie polecenia, za pomocą MEF

Zarządzane rozszerzenia RAM (MEF) przedstawia alternatywną metodę definiowania menu poleceń w menu Wykres.Jego podstawowym celem jest umożliwienie DSL być rozszerzony przez Ciebie lub przez inne strony.Użytkowników można wybrać opcję zainstalowania tylko DSL lub mogą zainstalować modem DSL i rozszerzenia.MEF zmniejsza również pracy Definiowanie polecenia menu skrótów, po wstępnej pracy, aby umożliwić MEF na modem DSL.

W tym temacie należy użyć metody, jeśli:

  1. Chcesz zdefiniować menu poleceń menu, inne niż w menu skrótów kliknij prawym przyciskiem myszy.

  2. Konieczne jest zdefiniowanie szczególnych grup poleceń w menu.

  3. Nie chcesz umożliwić innym rozszerzanie DSL z ich własnych poleceń.

  4. Chcesz zdefiniować jednego polecenia.

W przeciwnym wypadku należy rozważyć przy użyciu metody MEF określenie polecenia.Aby uzyskać więcej informacji, zobacz Przedłużenie linii DSL za pomocą MEF.

Stwierdzenie polecenia w Commands.Vsct

Polecenia menu są zadeklarowane w DslPackage\Commands.vsct.Te definicje Określ etykiety elementów menu i gdzie pojawiają się na pasku menu.

Plik, który można edytować, Commands.vsct, przywóz definicje z kilku plików .h, które znajdują się w katalogu ścieżki instalacji Visual Studio SDK\VisualStudioIntegration\Common\Inc.Obejmuje ona także GeneratedVsct.vsct, który jest generowany na podstawie definicji sieci DSL.

Aby uzyskać więcej informacji o plikach .vsct, zobacz Visual Studio polecenia Tabela (.Pliki Vsct).

Aby dodać polecenie

  1. W Solution Explorer, pod DslPackage projektu, otwórz Commands.vsct.

  2. W Commands element, zdefiniować jeden lub więcej przycisków i grupy.A przycisku jest element menu.A 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 grupa jest identyfikowane przez identyfikator GUID i całkowitą identyfikatora.Z tego samego identyfikatora GUID, można utworzyć kilka grup i przyciski.Muszą jednak mieć różne identyfikatory.Identyfikator GUID nazwy i Identyfikatora nazwy są tłumaczone na rzeczywiste identyfikatory GUID oraz identyfikatory numeryczne w <Symbols> węzła.

  3. Dodać ograniczenie widoczności dla polecenia jest ładowany tylko w kontekście języka specyficzne dla domeny.Aby uzyskać więcej informacji, zobacz VisibilityConstraints Element.

    Aby to zrobić, Dodaj następujące elementy w CommandTable elementu po Commands element.

    <VisibilityConstraints>
      <!-- Ensures the command is only loaded for this DSL -->
      <VisibilityItem guid="guidCustomMenuCmdSet" id="cmdidMyContextMenuCommand"
        context="guidEditor"/>
    </VisibilityConstraints>
    
  4. Służy do definiowania nazw, które zostały użyte dla identyfikatorów GUID oraz identyfikatory.Aby to zrobić, należy dodać Symbols element w CommandTable elementu po Commands element.

    <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. Zastąpić {000...000} z identyfikatorem GUID, który identyfikuje elementy menu i grup.Aby uzyskać nowy identyfikator GUID, należy użyć Utwórz identyfikator GUID tool na Narzędzia menu.

    [!UWAGA]

    Jeśli dodasz więcej grup lub elementów menu, można użyć tego samego identyfikatora GUID.Jednakże, należy użyć nowe wartości dla IDSymbols.

  6. W kodzie skopiowaną z tej procedury należy zastąpić każde wystąpienie następujące ciągi z własnych ciągi znaków:

    • grpidMyMenuGroup

    • cmdidMyContextMenuCommand

    • guidCustomMenuCmdSet

    • My polecenia Menu kontekstowego

Zaktualizowana wersja pakietu w Package.tt

Przy dodawaniu lub zmienić polecenie Aktualizuj version parametr ProvideMenuResourceAttribute zastosowanego do klasy pakiet przed udostępnieniem nowej wersji języka specyficzne dla domeny.

Ponieważ klasa pakietu jest zdefiniowana w wygenerowanym pliku, należy zaktualizować atrybut w pliku szablonu tekst, który generuje plik Package.cs.

Aby zaktualizować plik Package.tt

  1. W Solution Explorer, DslPackage projektu w GeneratedCode folderu, otwórz plik Package.tt.

  2. Zlokalizuj ProvideMenuResource atrybut.

  3. Przyrost version parametr atrybut, który jest drugim parametrem.Jeśli chcesz, można napisać Nazwa parametru jawnie w celu przypomnienia o jego przeznaczenie.Na przykład:

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

Definiowanie zachowania polecenia

Modem DSL ma już niektórych poleceń, które są implementowane w częściowej klasy, która jest zadeklarowana w DslPackage\GeneratedCode\CommandSet.cs.Aby dodać nowe polecenia, należy rozszerzyć tej klasy przez utworzenie nowego pliku, który zawiera częściowego zgłoszenia tej samej klasy.Nazwa klasy jest zwykle <YourDslName>CommandSet.Warto rozpocząć od sprawdzenia nazwę klasy i sprawdza jego zawartość.

Jest pochodną klasy polecenia set CommandSet.

Rozszerzenie klasy CommandSet

  1. W oknie Solution Explorer, w programie project DslPackage Otwórz GeneratedCode folder, a następnie Szukaj pod CommandSet.tt i otwórz jego wygenerowany plik CommandSet.cs.Uwaga obszaru nazw i nazwę pierwszej klasy, która jest zdefiniowane.Być może na przykład, zobacz:

    namespace Company.Language1

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

  2. W DslPackage, utwórz folder o nazwie kod niestandardowy.W tym folderze, należy utworzyć nowy plik klasy o nazwie CommandSet.cs.

  3. W nowym pliku zapisu częściowa deklaracja, która ma tę samą nazwę, jak wygenerowany częściowej klasy i obszaru nazw.Na przykład:

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

    { internal partial class Language1CommandSet { ...

    Uwaga Jeżeli szablonu klasy są używane do tworzenia nowego pliku, należy usunąć zarówno obszaru nazw i nazwy klasy.

Dd820681.collapse_all(pl-pl,VS.110).gifRozszerzenie klasy polecenia Set

Polecenie set kodu zazwyczaj trzeba importować następujące obszary 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;

Dopasuj obszar nazw i nazwę klasy, aby dostosować je w wygenerowanym CommandSet.cs:

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

Konieczne jest zdefiniowanie dwóch metod, jeden do określenia, kiedy polecenie będzie widoczny w menu kontekstowe, a drugi do wykonywania polecenia.Metody te nie są przesłonięcia; Zamiast tego należy zarejestrować je w listę poleceń.

Dd820681.collapse_all(pl-pl,VS.110).gifZdefiniować, kiedy polecenie będzie widoczne

Dla każdego polecenia, należy zdefiniować OnStatus... metodę, która określa, czy polecenie pojawi się menu i czy będzie włączona, lub na szaro.Ustaw Visible i Enabled właściwości MenuCommand, jak pokazano w poniższym przykładzie.Metoda ta jest wywoływana w celu skonstruowania zawsze po kliknięciu prawym przyciskiem myszy diagram, więc musi działać szybko w menu skrótów.

W tym przykładzie polecenie jest widoczny tylko wtedy, gdy użytkownik wybrał określonego typu kształtu i jest włączone tylko wtedy, gdy jest co najmniej jeden z wybranych elementów w określonym stanie.Przykład jest oparty na szablonie klasy Diagram DSL i ClassShape i ModelClass są typy, które są zdefiniowane w modem 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 bardzo użyteczne w metody OnStatus:

  • this.CurrentSelection.Użytkownik kliknął prawym przyciskiem myszy kształtu zawsze znajduje się na tej liście.Jeśli użytkownik kliknie na pustą część diagramu, Diagram jest jedynym członkiem listy.

  • this.IsDiagramSelected() - trueJeśli użytkownik kliknie pusty część diagramu.

  • this.IsCurrentDiagramEmpty()

  • this.IsSingleSelection()-użytkownik nie zaznaczono wiele obiektów

  • this.SingleSelection-kształtu lub diagram, który użytkownik kliknął prawym przyciskiem myszy

  • shape.ModelElement as MyLanguageElement-element modelu reprezentowany przez kształt.

Jak ogólne wytyczne, należy Visible właściwości zależą od tego, jaki element jest zaznaczony, a następnie upewnij Enabled właściwości zależy od stanu wybranych elementów.

Metoda OnStatus nie należy zmieniać stan magazynu.

Dd820681.collapse_all(pl-pl,VS.110).gifOkreślenie, co robi polecenia

Dla każdego polecenia, należy zdefiniować OnMenu... metodę, która wykonuje działania wymagane, gdy użytkownik kliknie polecenie menu.

Po wprowadzeniu zmian do elementów modelu, należy to zrobić wewnątrz transakcji.Aby uzyskać więcej informacji, zobacz Jak: Modyfikowanie standardowego polecenia Menu w języku specyficzne dla domeny.

W tym przykładzie ClassShape, ModelClass, i Comment są typy, które są zdefiniowane w DSL, który pochodzi od szablonu klasy Diagram 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, dotyczące przejścia od obiekt w modelu i o sposobach tworzenia obiektów i łączy, zobacz Jak: Modyfikowanie standardowego polecenia Menu w języku specyficzne dla domeny.

Dd820681.collapse_all(pl-pl,VS.110).gifRegister, polecenie

Należy powtórzyć w C# deklaracji wartości identyfikatora GUID i identyfikator, wprowadzone w sekcji symboli CommandSet.vsct:

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

Użyj tej samej wartości identyfikatora GUID, jak wstawione w Commands.vsct.

[!UWAGA]

Jeśli zmienisz sekcji symboli w pliku VSCT, należy także zmienić deklaracje te odpowiadają.Powinna również zwiększać numer wersji w Package.tt

Polecenia z menu należy zarejestrować jako część zestawu poleceń.GetMenuCommands()nazywa się po 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;
} 

Badania, polecenie

Budowanie i uruchom modem DSL w doświadczalnych wystąpienie programu Visual Studio.Polecenie powinno pojawić się w menu skrótów w określonych sytuacjach.

Wykonywanie polecenia

  1. Na Solution Explorer paska narzędzi, kliknij przycisk Transform wszystkie szablony.

  2. Naciśnij klawisz F5 odbudować roztworu i rozpocząć debugowanie języka specyficzne dla domen w kompilacji doświadczalnych.

  3. Otwórz przykładowy diagram budowanie doświadczalnych.

  4. Kliknij prawym przyciskiem myszy różnych elementów w diagramie, aby zweryfikować, że polecenie jest poprawnie włączone lub wyłączone i odpowiednio pokazane lub ukryte, w zależności od wybranego elementu.

Rozwiązywanie problemów

W menu nie ma polecenia:

  • Polecenie pojawi się tylko w debugowanie wystąpień programu Visual Studio, dopóki nie zostanie zainstalowany pakiet DSL.Aby uzyskać więcej informacji, zobacz Wdrażanie rozwiązań języka specyficzne dla domeny.

  • Upewnij się, że Twoje doświadczalnych próbki ma rozszerzenie nazwy pliku jest poprawna dla tego modemu DSL.Aby sprawdzić rozszerzenie nazwy pliku, otwórz DslDefinition.dsl w głównym wystąpienie programu Visual Studio.Następnie w Eksploratorze DSL, prawym przyciskiem myszy węzeł edytor, a następnie kliknij polecenie Właściwości.W oknie dialogowym właściwości sprawdź właściwość Rozszerzenie_pliku.

  • DID you przyrostu numer wersji pakietu?

  • Ustaw punkt przerwania na początku metodę OnStatus.Powinna ona break po kliknięciu prawym przyciskiem myszy nad dowolną częścią diagramu.

    Nie wywoływana jest metoda OnStatus:

    • Upewnij się, że identyfikatory GUID oraz identyfikatory w kodzie CommandSet odpowiadają numerom stron w sekcji symboli Commands.vsct.

    • W 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 devenv /rootsuffix exp /setup.Następnie ponownie uruchom wystąpienie debugowania Visual Studio.

  • Krok za pomocą metody OnStatus, aby zweryfikować tego polecenia.Widoczny i polecenia.Włączone są ustawione na wartość true.

Zostanie wyświetlone menu niewłaściwy tekst lub polecenia pojawia się w niewłaściwym miejscu:

  • Upewnij się, że kombinacja identyfikatora GUID i identyfikator jest unikatowy dla tego polecenia.

  • Upewnij się, że zostały odinstalowane z wcześniejszych wersji pakietu.

Zobacz też

Koncepcje

Jak: Modyfikowanie standardowego polecenia Menu w języku specyficzne dla domeny

Inne zasoby

Pisanie kodu, aby dostosować język specyficzne dla domeny

Przykładowy kod: diagramy