Udostępnij za pośrednictwem


Porady: definiowanie polecenia menu na diagramie modelowania

W Visual Studio Ultimate można zdefiniować dodatkowe elementy menu w menu skrótów diagramu UML.Można kontrolować, czy polecenie menu pojawia się i jest włączone w menu skrótów każdego jakiegokolwiek elementu w diagramie i czy można napisać kod, który jest uruchamiany, gdy użytkownik wybierze element menu.Można spakować te rozszerzenia w Rozszerzeniu Integracji programu Visual Studio (VSIX) i rozdystrybuować je innym użytkownikom programu Visual Studio.

Wymagania

Definiowanie polecenia menu

Aby utworzyć menu polecenia dla projektanta UML, należy utworzyć klasę, która definiuje zachowanie polecenia i osadzić tę klasę w rozszerzeniu Visual Studio Integration (VSIX)VSIX działa jako kontener, który może zainstalować polecenia.Istnieją dwie alternatywne metody definiowania polecenia menu:

  • Utwórz polecenie menu w jego własnym VSIX przy użyciu szablonu projektu. To jest szybsza metoda.Użyj go, jeśli nie chcesz połączyć poleceń menu z innymi rodzajami rozszerzeń takich jak rozszerzenie sprawdzania poprawności, elementy do przybornika niestandardowego lub program obsługi gestów.

  • Utwórz osobne polecenie menu i projektów VSIX. Metoda ta jest używana, jeśli chcesz połączyć kilka rodzajów rozszerzeń w samym VSIX.Na przykład, jeśli polecenie menu oczekuje modelu do przestrzegania szczególnych ograniczeń, można go osadzić w samym VSIX jako metodę sprawdzania poprawności.

Aby utworzyć polecenie menu w jego własnym VSIX

  1. W oknie dialogowym Nowy projekt w polu Projekty modelowania, wybierz opcję Rozszerzenie polecenia.

  2. Otwórz .cs plik w nowym projekcie i modyfikuj CommandExtension klasę, aby wdrożyć swoje polecenie.

    Aby uzyskać więcej informacji, zobacz Implementacja polecenia menu.

  3. Dodatkowe polecenia można dodać do tego projektu, definiując nowe klasy.

  4. Przetestuj polecenie menu, naciskając klawisz F5.Aby uzyskać więcej informacji, zobacz Uruchamianie polecenia menu.

  5. Zainstaluj polecenie menu na innym komputerze przez skopiowanie pliku bin\*\*.vsix utworzonego w projekcie.Aby uzyskać więcej informacji, zobacz Instalowanie polecenia menu.

W tym miejscu jest alternatywna procedura:

Aby utworzyć polecenie menu w projekcie osobnej klasy biblioteki (DLL)

  1. Utwórz projekt biblioteki klas, w nowym rozwiązaniu programu Visual Studio lub w istniejącym rozwiązaniu.

    1. W pasku menu wybierz Plik, Nowy, Projekt.

    2. Pod zainstalowane szablony, wybierz opcję programu Visual C# lub programu Visual Basic.W środkowej kolumnie wybierz Biblioteka klas.

    3. Ustaw Rozwiązanie do wskazania, czy chcesz utworzyć nowe rozwiązanie lub dodać składnik do rozwiązania VSIX, które jest już otwarte.

    4. Ustaw Nazwę i lokalizację projektu i kliknij przycisk OK.

  2. Dodaj następujące odwołania do własnego projektu.

    Odwołanie

    Co Ci to pozwala zrobić

    System.ComponentModel.Composition

    Zdefiniuj składniki za pomocą Managed Extensibility Framework (MEF).

    Microsoft.VisualStudio.Uml.Interfaces

    Odczytaj i zamień właściwości elementów modelu.

    Microsoft.VisualStudio.ArchitectureTools.Extensibility

    Utwórz elementy modelu, modyfikuj kształty na diagramach.

    Microsoft.VisualStudio.Modeling.Sdk.12.0

    Zdefiniuj model obsługi zdarzeń.

    Hermetyzuj serię zmian do modelu.Aby uzyskać więcej informacji, zobacz Porady: łączenie aktualizacji modeli za pomocą transakcji.

    Microsoft.VisualStudio.Modeling.Sdk.Diagrams.12.0

    (nie zawsze wymagane)

    Elementy diagramu dodatkowego dostępu dla procedur obsługi gestu.

    Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer

    Wymagane tylko w przypadku polecenia na diagramach warstwy.Aby uzyskać więcej informacji, zobacz Rozszerzanie diagramów warstw.

    Zdefiniuj polecenia na diagramie warstwy.

  3. Dodaj plik klasy do projektu i ustawi jego zawartość do następującego kodu.

    [!UWAGA]

    Zmień przestrzeń nazw, nazwę klasy i wartość zwracaną przez Text zgodnie z preferencjami.

    W przypadku zdefiniowania wielu poleceń, pojawiają się one w menu w kolejności alfabetycznej według nazw klas.

    using System.ComponentModel.Composition;   
    using System.Linq;
    using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
    using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
    using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
    using Microsoft.VisualStudio.Uml.AuxiliaryConstructs;
    using Microsoft.VisualStudio.Uml.Classes; 
        // ADD other UML namespaces if required
    
    namespace UMLmenu1 // CHANGE
    {
      // DELETE any of these attributes if the command
      // should not appear in some types of diagram.
      [ClassDesignerExtension]
      [ActivityDesignerExtension]
      [ComponentDesignerExtension]
      [SequenceDesignerExtension]
      [UseCaseDesignerExtension] 
      // [LayerDesignerExtension]
    
      // All menu commands must export ICommandExtension:
      [Export (typeof(ICommandExtension))]
      // CHANGE class name – determines order of appearance on menu:
      public class Menu1 : ICommandExtension
      {
        [Import]
        public IDiagramContext DiagramContext { get; set; }
    
        public void QueryStatus(IMenuCommand command)
        { // Set command.Visible or command.Enabled to false
          // to disable the menu command.
          command.Visible = command.Enabled = true;
        }
    
        public string Text
        {
          get { return "MENU COMMAND LABEL"; }
        }
    
        public void Execute(IMenuCommand command)
        {
          // A selection of starting points:
          IDiagram diagram = this.DiagramContext.CurrentDiagram;
          foreach (IShape<IElement> shape in diagram.GetSelectedShapes<IElement>())
          { IElement element = shape.Element; }
          IModelStore modelStore = diagram.ModelStore;
          IModel model = modelStore.Root;
          foreach (IElement element in modelStore.AllInstances<IClass>()) 
          { }
        }
      }
    }
    

    Aby uzyskać więcej informacji o tym, co umieścić w metodach, zobacz Implementowanie polecenia menu.

Musisz dodać swoje polecenie menu do projektu VSIX, który działa jako kontener dla polecenia instalowania.Jeśli chcesz, możesz dodać inne składniki w tym samym VSIX.

Aby dodać polecenie menu do projektu VSIX

  1. Nie potrzebujesz tej procedury po utworzeniu polecenia menu z własnej VSIX.

  2. Utwórz projekt VSIX, chyba, że rozwiązanie zawiera już jeden.

    1. W Eksploratorze rozwiązań w menu skrótów rozwiązania wybierz Dodaj, Nowy projekt.

    2. Pod zainstalowane szablony, rozwiń program Visual C# lub program Visual Basic, następnie wybierz rozszerzalności.W środkowej kolumnie wybierz Projekt VSIX.

  3. W Eksploratorze rozwiązań, w menu skrótów projektu VSIX, wybierz Ustaw jako projekt startowy.

  4. Otwórz source.extension.vsixmanifest.

    1. W zakładce Metadane ustaw nazwę VSIX.

    2. W zakładce Instaluj obiekty docelowe ustaw program Visual Studio Ultimate i Premium jako obiekty docelowe.

    3. W zakładce Aktywa wybierz polecenie Nowy i w oknie dialogowym ustaw:

      Typ = składnik MEF

      Źródło = projektu w bieżącym rozwiązaniu

      Projekt = Your class library project

Wdrażanie polecenia Menu

Klasa polecenia menu implementują metody wymagane dla ICommandExtension.

string Text { get; }

Zwraca etykietę elementu menu.

void QueryStatus(IMenuCommand command);

Wywołane, gdy użytkownik kliknie prawym przyciskiem myszy na diagramie.

Ta metoda nie powinna zmieniać modelu.

Używaj DiagramContext.CurrentDiagram.SelectedShapes do określenia, czy ma się pojawić się i zostać włączone polecenie.

Ustaw:

  • command.Visible na true jeśli polecenie musi pojawić się w menu, gdy użytkownik kliknie prawym przyciskiem myszy na diagramie

  • command.Enabled na true jeśli użytkownik może kliknąć polecenie w menu

  • command.Text, aby ustawić dynamicznie etykiety menu

void Execute (IMenuCommand command);

Wywołane po kliknięciu danego elementu menu, jeśli jest widoczne i włączone.

 

Uzyskiwanie dostępu do modelu w kodzie

Uwzględnianie następującej deklaracji w klasie polecenia menu:

[Import] public IDiagramContext DiagramContext { get; set; }

...

Deklaracja IDiagramContext umożliwia pisanie kodu w Twoich metodach, które uzyskują dostęp do diagramu, bieżącego zaznaczenie i modelu:

IDiagram diagram = this.DiagramContext.CurrentDiagram;
foreach (IShape<IElement> shape in diagram.GetSelectedShapes<IElement>())
{ IElement element = shape.Element; ... }
IModelStore modelStore = diagram.ModelStore;
IModel model = modelStore.Root;
foreach (IElement element in modelStore.AllInstances<IUseCase>()) {...}

Nawigacja i aktualizowanie modelu

Elementy modelu UML są dostępne za pośrednictwem interfejsu API.Z bieżącego zaznaczenia lub z katalogu głównego modelu, można uzyskać dostęp do wszystkich innych elementów.Aby uzyskać więcej informacji, zobacz Porady: nawigowanie po modelu UML i Programowanie za pomocą API UML.

Jeśli masz do czynienia z diagramem sekwencji, zobacz też Porady: edytowanie diagramów sekwencyjnych przy użyciu API UML.

Interfejs API umożliwia również zmienienie właściwości elementów, usunięcie elementów i relacji i tworzenie nowych elementów i relacji.

Domyślnie każda zmiana wprowadzona w metodzie Wykonaj będzie wykonywana w oddzielnej transakcji.Użytkownik będzie mógł cofnąć oddzielnie każdą zmianę.Jeśli chcesz grupować zmiany w pojedynczą transakcję, użyj ILinkedUndoTransaction zgodnie z opisem w Porady: łączenie aktualizacji modeli za pomocą transakcji.

Użyj wątku interfejsu użytkownika dla aktualizacji

W niektórych przypadkach może to być przydatne do wykonywania aktualizacji w modelu z wątku tła.Na przykład, jeśli polecenia powoduje załadowanie danych z zasobów powolnych, można wykonać ładowanie w wątku tła tak, że użytkownik może obserwować zmiany w trakcie i anulować operację, jeśli to konieczne.

Należy jednak pamiętać, że magazyn modelu nie jest bezpieczny dla wątków.Należy zawsze używać wątku interfejsu użytkownika do aktualizacji i jeśli to możliwe, zabrania się użytkownikom wprowadzania zmian w trakcie operacji tła.Aby zobaczyć przykład, zobacz Porady: aktualizowanie modelu UML z wątku w tle.

Wykonywanie polecenia menu

Do celów testowych wykonaj polecenia w trybie debugowania.

Aby przetestować polecenia menu

  1. Naciśnij klawisz F5 lub w menu Debugowanie zaznacz Rozpocznij debugowanie.

    Eksperymentalne wystąpienie Visual Studio rozpoczyna się.

    Rozwiązywanie problemów z: Jeśli nowego Visual Studio nie można uruchomić:

    • Jeśli masz więcej niż jeden projekt, upewnij się, że projekt VSIX jest ustawiony jako projekt startowy rozwiązania.

    • W Eksploratorze rozwiązań, w menu skrótów uruchamiania lub tylko projektu, wybierz Właściwości.W edytorze właściwości projektu zaznacz kartę Debugowanie.Upewnij się, że ciąg w polu Uruchomienie zewnętrznego programu jest pełną nazwą ścieżki Visual Studio, zazwyczaj:

      C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe

  2. W eksperymentalnym Visual Studio, otwórz lub stwórz projektu modelowania i otworzyć lub utworzyć diagram modelowania.Użyj diagramu, który należy do jednego z typów wymienionych w atrybucie klasy menu poleceń.

  3. Otwórz menu skrótów w dowolnym miejscu na diagramie.Twoje polecenie powinno pojawić się w menu.

    Rozwiązywanie problemów z: Jeśli w menu nie ma polecenia, upewnij się, że:

    • Projekt polecenia menu jest wymieniony jako składnik listy MEF zakładki Aktywa w source.extensions.manifest w projekcie VSIX.

    • Parametry Import i Export atrybuty są prawidłowe.

    • QueryStatus metoda nie ustawia command.Enabled ani Visible pól na false.

    • Typ diagramu modelu, którego używasz (klasa UML, sekwencja i tak dalej) jest wymieniony jako jeden z atrybutów klasy polecenia menu [ClassDesignerExtension], [SequenceDesignerExtension] i tak dalej.

Instalowanie i odinstalowywanie rozszerzenia

Można zainstalować Visual Studio rozszerzenie zarówno na swoim komputerze jak i na innych komputerach.

Aby zainstalować rozszerzenie

  1. Na komputerze, należy odnaleźć plik .vsix, który został zbudowany przez projekt VSIX.

    1. W Eksploratorze rozwiązań, w menu skrótów projektu VSIX wybierz Otwórz folder w Eksploratorze Windows.

    2. Zlokalizuj plik bin\*\YourProject.vsix

  2. Kopiuj plik .vsix do komputera miejsca docelowego, na którym chcesz zainstalować rozszerzenie.Może to być twój własny komputer, albo inny.

    Komputer docelowy musi mieć jedną z wersji systemu Visual Studio określonej w source.extension.vsixmanifest.

  3. Na komputerze docelowym otwórz .vsix pliku, na przykład, klikając go dwukrotnie.

    Instalator rozszerzenia programu Visual Studio otwiera i instaluje rozszerzenia.

  4. Uruchom lub ponownie uruchom Visual Studio.

Aby odinstalować rozszerzenie

  1. W menu Narzędzia wybierz Menedżer rozszerzeń.

  2. Rozwiń Zainstalowane rozszerzenia.

  3. Zaznacz rozszerzenie, a następnie wybierz Odinstaluj.

Rzadko wadliwe rozszerzenie nie ładuje się i tworzy raport w oknie błędów, ale nie pojawia się w Menedżerze rozszerzeń.W takim przypadku należy usunąć rozszerzenie przez usunięcie pliku z:

%LocalAppData%\Local\Microsoft\VisualStudio\12.0\Extensions

Przykład

Poniższy przykład zawiera kod dla polecenia menu, które zamieni nazwy dwóch elementów na diagramie klasy.Kod ten musi być zbudowany w Visual Studio rozszerzeniu projektu i zainstalowany zgodnie z opisem w poprzedniej sekcji.

using System.Collections.Generic; // for IEnumerable
using System.ComponentModel.Composition;
  // for [Import], [Export]
using System.Linq; // for IEnumerable extensions
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
  // for IDiagramContext
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
  // for designer extension attributes
using Microsoft.VisualStudio.Modeling.Diagrams;
  // for ShapeElement
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
  // for IGestureExtension, ICommandExtension, ILinkedUndoContext
using Microsoft.VisualStudio.Uml.Classes;
  // for class diagrams, packages

/// <summary>
/// Extension to swap names of classes in a class diagram.
/// </summary>
namespace SwapClassNames
{
  // Declare the class as an MEF component:
  [Export(typeof(ICommandExtension))]
  [ClassDesignerExtension]
  // Add more ExportMetadata attributes to make
  // the command appear on diagrams of other types.
  public class NameSwapper : ICommandExtension
  {
  // MEF required interfaces:
  [Import]
  public IDiagramContext Context { get; set; }
  [Import]
  public ILinkedUndoContext LinkedUndoContext { get; set; }

  /// <summary>
  /// Swap the names of the currently selected elements.
  /// </summary>
  /// <param name="command"></param>
  public void Execute(IMenuCommand command)
  {
    // Get selected shapes that are IClassifiers -
    // IClasses, IInterfaces, IEnumerators.
    var selectedShapes = Context.CurrentDiagram
     .GetSelectedShapes<IClassifier>();
    if (selectedShapes.Count() < 2) return;

    // Get model elements displayed by shapes.
    IClassifier firstElement = selectedShapes.First().Element;
    IClassifier lastElement = selectedShapes.Last().Element;

    // Do the swap in a transaction so that user
    // cannot undo one change without the other.
    using (ILinkedUndoTransaction transaction =
    LinkedUndoContext.BeginTransaction("Swap names"))
    {
    string firstName = firstElement.Name;
    firstElement.Name = lastElement.Name;
    lastElement.Name = firstName;
    transaction.Commit();
    }
  }

  /// <summary>
  /// Called by Visual Studio to determine whether
  /// menu item should be visible and enabled.
  /// </summary>
  public void QueryStatus(IMenuCommand command)
  { 
    int selectedClassifiers = Context.CurrentDiagram
     .GetSelectedShapes<IClassifier>().Count();
    command.Visible = selectedClassifiers > 0;
    command.Enabled = selectedClassifiers == 2;
  }

  /// <summary>
  /// Name of the menu command.
  /// </summary>
  public string Text
  {
    get { return "Swap Names"; }
  }
  }

}

Zobacz też

Koncepcje

Porady: definiowanie i instalowanie rozszerzenia modelowania

Rozszerzanie diagramów i modeli UML

Porady: definiowanie procedury obsługi gestów na diagramie modelowania

Porady: definiowanie niestandardowego elementu przybornika modelowania

Porady: definiowanie ograniczeń walidacji dla modeli UML

Porady: edytowanie diagramów sekwencyjnych przy użyciu API UML

Programowanie za pomocą API UML

Inne zasoby

Przykład: Polecenie połączenia kształtów w diagramie UML