Sdílet prostřednictvím


Postupy: Definování příkazu nabídky v diagramu modelování

Ve Visual Studio Ultimate můžete definovat další položky nabídky v místních nabídkách diagramu UML.Můžete určit, zda se příkaz nabídky zobrazí a je povolen v místní nabídce libovolného prvku v diagramu a můžete napsat kód, který se spustí, když uživatel klepne na položku nabídky.Tato rozšíření lze zabalit do rozšíření integrace aplikace Visual Studio (VSIX) a distribuovat ho ostatním uživatelům aplikace Visual Studio.

Požadavky

Definování příkazu nabídky

Chcete-li vytvořit příkaz nabídky pro UML designer, musíte vytvořit třídu, která definuje chování příkazu, a vložit tuto třídu do VSIX.VSIX funguje jako kontejner, který může příkaz nainstalovat.Existují dva alternativní způsoby definování příkazu nabídky:

  • Vytvořte příkaz nabídky ve vlastním souboru VSIX pomocí šablony projektu. Toto je rychlejší metoda.Pokud nechcete, aby vaše příkazy nabídek kombinovat s jinými typy rozšíření například rozšířeními ověřování, vlastními položkami panelu nástrojů nebo obslužnými rutinami gest, použijte ji.

  • Vytvořte samostatný příkaz nabídky a projekty VSIX. Tuto metodu použijte, pokud chcete sloučit několik typů rozšíření do stejného VSIX.Například pokud váš příkaz nabídky očekává, že model bude dodržovat zvláštní omezení, můžete jej vložit do stejného VSIX jako metodu ověřování.

Vytvoření příkazu nabídky ve vlastním souboru VSIX

  1. V dialogovém okně Nový projekt, v části Modelování projektů, vyberte Rozšíření příkazu.

  2. Otevřete soubor .cs v novém projektu a upravte třídu CommandExtension pro implementaci příkazu.

    Další informace naleznete v tématu Implementace příkazu nabídky.

  3. Další příkazy můžete přidat do tohoto projektu definováním nových tříd.

  4. Otestujte příkaz nabídky stisknutím klávesy F5.Další informace viz Provádění příkazu nabídky.

  5. Nainstalujte příkaz nabídky v jiném počítači zkopírováním souboru bin\*\*.vsix, který je sestaven projektem.Další informace naleznete v tématu Instalace příkazu nabídky.

Zde je alternativní postup:

Vytvoření příkazu nabídky v samostatném projektu knihovny tříd (DLL)

  1. Vytvořte projekt knihovny tříd v novém řešení Visual Studio nebo v existujícím řešení.

    1. V nabídce Soubor zvolte položku Nový, Projekt.

    2. V části Nainstalované šablony vyberte možnost Visual C# nebo Visual Basic a poté možnost Třída.V prostředním sloupci zvolte Knihovna tříd.

    3. Nastavte Řešení pro určení, zda chcete vytvořit nové řešení nebo přidat součást do řešení VSIX, které jste již otevřeli.

    4. Zadejte název a umístění projektu a klepněte na tlačítko OK.

  2. Do projektu přidejte následující odkazy.

    Odkaz

    Co vám to umožňuje provádět

    System.ComponentModel.Composition

    Definovat součásti pomocí Managed Extensibility Framework (MEF).

    Microsoft.VisualStudio.Uml.Interfaces

    Přečtěte si vlastnosti modelových prvků a změňte je.

    Microsoft.VisualStudio.ArchitectureTools.Extensibility

    Vytvořit prvky modelu, upravit obrazce v diagramech.

    Microsoft.VisualStudio.Modeling.Sdk.12.0

    Definování obslužných rutin události modelu.

    Zapouzdření sérii změn do modelu.Další informace naleznete v tématu Postupy: Propojení aktualizací modelů pomocí transakcí.

    Microsoft.VisualStudio.Modeling.Sdk.Diagrams.12.0

    (není vždy nutné)

    Přístup k dalším prvkům diagramu pro obslužné rutiny gest.

    Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer

    Požadováno pouze pro příkazy v diagramech vrstev.Další informace naleznete v tématu Rozšíření diagramů vrstev.

    Definujte příkazy diagramu Vrstva.

  3. Přidejte soubor třídy do projektu a nastavte jeho obsah na následující kód.

    [!POZNÁMKA]

    Změnit obor názvů, název třídy a hodnotu vrácenou Text dle požadavků.

    Pokud definujete více příkazů, v nabídce jsou uvedeny v abecedním pořadí názvů tříd.

    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>()) 
          { }
        }
      }
    }
    

    Další informace o tom, co vložit do metod, viz Implementace příkazu nabídky.

Příkaz nabídky je nutné přidat do projektu VSIX, který se chová jako kontejner pro instalaci příkazu.Pokud chcete, můžete zahrnout další součásti do stejného VSIX.

Přidání příkazu nabídky do projektu VSIX

  1. Nepotřebujete tuto proceduru, pokud jste vytvořili příkaz nabídky s vlastním souborem VSIX.

  2. Vytvořte projekt VSIX, pokud vaše řešení již existuje.

    1. Průzkumníku řešení v místní nabídce řešení zvolte Přidat, Nový projekt.

    2. V části Nainstalované šablony rozbalte možnost Visual C# nebo Visual Basic a potom vyberte možnost Rozšiřitelnost.V prostředním sloupci zvolte Projekt VSIX.

  3. V Průzkumníku řešení v místní nabídce projektu VSIX zvolte Nastavit jako projekt po spuštění.

  4. Otevřete source.extension.vsixmanifest.

    1. Na kartě MetaData nastavte název souboru VSIX.

    2. Na kartě Cíle instalace nastavte sady Visual Studio Ultimate a Premium jako cíle.

    3. Na kartě Aktiva vyberte možnost Nové a v dialogovém okně nastavte:

      Typ = Komponenta MEF

      Zdroj = Projekt v aktuálním řešení.

      Projekt = Your class library project

Implementace příkazu nabídky

Příkaz nabídky implementuje požadované metody pro ICommandExtension.

string Text { get; }

Vrátí popisek položky nabídky.

void QueryStatus(IMenuCommand command);

Volána, když uživatel klepne pravým tlačítkem myši v diagramu.

Tato metoda by neměla změnit model.

Použijte DiagramContext.CurrentDiagram.SelectedShapes k určení, zda se má příkaz zobrazit a povolit.

Nastavit:

  • command.Visible na true, pokud příkaz musí být uveden v nabídce, když uživatel klepne pravým tlačítkem myši v diagramu

  • command.Enabled na true, pokud uživatel může kliknout na příkaz v nabídce

  • command.Text, chcete-li nastavit popisek nabídky dynamicky

void Execute (IMenuCommand command);

Voláno po kliknutí na položku nabídky, pokud je viditelná a povolená.

 

Přístup k modelu v kódu

Zahrnutí následujícího prohlášení do třídy příkazů nabídky:

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

...

Deklarace IDiagramContext vám umožňuje napsat kód ve vašich metodách, který přistupuje k diagramu, aktuálnímu výběru a 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>()) {...}

Prvky modelu UML jsou všechny k dispozici prostřednictvím rozhraní API.Z aktuálního výběru nebo v kořenové lokalitě modelu můžete přistupovat ke všem ostatním prvkům.Další informace naleznete v tématu Postupy: Procházení modelu UML a Programování s rozhraním API UML.

Pokud pracujete se sekvenčním diagramem, viz také Postupy: Úpravy sekvenčních diagramů pomocí rozhraní API UML.

Rozhraní API také umožňuje měnit vlastnosti prvků, odstraňovat prvky a vztahy a vytvářet nové prvky a vztahy.

Ve výchozím nastavení budou provedeny jednotlivé změny, které provedete ve své metodě Execute, v samostatných transakcích.Uživatel bude moci vrátit každou změnu zvlášť.Pokud chcete seskupit změny do jediné transakce, použijte ILinkedUndoTransaction, jak je popsáno v Postupy: Propojení aktualizací modelů pomocí transakcí.

Použijte vlákno uživatelského rozhraní pro aktualizace

V některých případech může být užitečné provést aktualizace v modelu z vlákna na pozadí.Například pokud váš příkaz načte data z pomalého zdroje, můžete provést načítání ve vláknu na pozadí, aby uživatel mohl zobrazit změny, když probíhají, a operaci v případě potřeby zrušit.

Měli byste si však být vědomi, že úložiště modelu není bezpečné pro vlákna.Vždy byste měli provádět aktualizace pomocí vlákna uživatelského rozhraní (UI), a pokud je to možné, zabránit uživateli v provádění úprav v průběhu operace na pozadí.Příklad naleznete v tématu Postupy: Aktualizace modelu UML z vlákna na pozadí.

Spouštění příkazu nabídky

Pro účely testování proveďte příkaz v režimu ladění.

Chcete-li otestovat příkaz nabídky

  1. Stiskněte klávesu F5 nebo v nabídce Ladit zvolte Spustit ladění.

    Spustí se experimentální instance aplikace Visual Studio.

    Poradce při potížích: Pokud se nová aplikace Visual Studio nespustí:

    • Pokud máte více než jeden projekt, ujistěte se, že projekt VSIX je nastaven jako projekt při spuštění řešení.

    • V Průzkumníku řešení v místní nabídce startupu nebo projektu zvolte Vlastnosti.V editoru vlastností projektu zvolte kartu Ladění.Ujistěte se, že řetězec v poli Spustit externí program je úplný název cesty Visual Studio, obvykle:

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

  2. V experimentální instanci aplikace Visual Studio otevřete nebo vytvořte projekt modelování a otevřete nebo vytvořte diagram modelování.Použijte diagram, který patří k jednomu z typů, které jsou uvedeny v atributech vaší třídy příkazu nabídky.

  3. Otevřete místní nabídku kdekoli v diagramu.Váš příkaz se zobrazí v nabídce.

    Poradce při potížích: Pokud se příkaz v nabídce nezobrazí, zkontrolujte, zda:

    • Projekt příkazu nabídky je uveden jako komponenta MEF na kartě Aktiva v source.extensions.manifest v projektu VSIX.

    • Parametry vlastností Import a Export jsou platné.

    • Metoda QueryStatus nenastavuje pole command.Enabled ani Visible na false.

    • Typ modelového diagramu, který používáte, (třída UML, sekvence a tak dále) je uveden jako jeden z atributů třídy příkazu nabídky [ClassDesignerExtension], [SequenceDesignerExtension] a tak dále.

Instalace a odinstalace rozšíření

Je možné nainstalovat rozšíření Visual Studio ve vašem počítači i v jiných počítačích.

Instalace rozšíření

  1. V počítači vyhledejte soubor .vsix, který byl vytvořen vaším projektem VSIX.

    1. V Průzkumníku řešení, v místní nabídce projektu VSIX, zvolte Otevřít složku v Průzkumníku Windows.

    2. Vyhledejte soubor bin\*\YourProject.vsix

  2. Zkopírujte soubor .vsix do cílového počítače, ve kterém chcete nainstalovat rozšíření.Může to být váš vlastní počítač nebo jiný.

    Cílový počítač musí mít jednu z edic systému Visual Studio, kterou jste zadali v source.extension.vsixmanifest.

  3. V cílovém počítači otevřete soubor .vsix soubor, například poklepáním.

    Instalační služba rozšíření sady Visual Studio se otevře a nainstaluje rozšíření.

  4. Spusťte nebo restartujte aplikaci Visual Studio.

Odinstalace rozšíření

  1. V nabídce Nástroje zvolte tlačítko Správce rozšíření.

  2. Rozbalte nainstalována rozšíření.

  3. Vyberte rozšíření a poté vyberte možnost Odinstalovat.

Jen zřídka se chybné rozšíření nedokáže načíst a vytvoří sestavu v okně chyb, ale nezobrazí se ve Správci rozšíření.V takovém případě můžete odebrat rozšíření odstraněním souboru z:

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

Příklad

Následující příklad ukazuje kód pro příkaz nabídky, který bude zamění názvy dvou prvků v diagramu třídy.Tento kód musí být součástí projektu rozšíření Visual Studio a nainstalovány, jak je popsáno v předchozích částech.

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"; }
  }
  }

}

Viz také

Koncepty

Postupy: Definování a instalace rozšíření modelování

Rozšiřování modelů a diagramů UML

Postupy: Definování obslužné rutiny gest v diagramu modelování

Postupy: Definování vlastní položky sady nástrojů pro modelování

Postupy: Definování omezení ověření pro modely UML

Postupy: Úpravy sekvenčních diagramů pomocí rozhraní API UML

Programování s rozhraním API UML

Další zdroje

: Příkaz pro zarovnání tvarů v diagramu UML