Condividi tramite


Aggiunta di comandi e movimenti a diagrammi livelli

È possibile definire i comandi di menu di scelta rapida ed i gestori delle gesti nei diagrammi a livello di Visual Studio Ultimate.È possibile comprimere queste estensioni in un progetto VSIX (Visual Studio Integration Extension) da distribuire ad altri utenti di Visual Studio.

È possibile definire vari gestori comandi e movimenti nello stesso progetto di Visual Studio.È anche possibile combinare vari progetti di questo tipo in un progetto VSIX.Ad esempio, è possibile definire un unico progetto VSIX che include comandi del livello, un linguaggio specifico di dominio e comandi per i diagrammi UML.

[!NOTA]

È inoltre possibile personalizzare la convalida dell'architettura, in cui il codice sorgente dell'utente viene confrontato con i diagrammi livello.È necessario definire la convalida dell'architettura in un progetto separato di Visual Studio.È possibile aggiungerlo allo stesso progetto VSIX come per le altre estensioni.Per ulteriori informazioni, vedere Aggiunta di strumenti di convalida architettura personalizzati a diagrammi livelli.

Requisiti per la creazione di estensioni del livello

È necessario che nel computer in cui si desidera sviluppare le estensioni del livello siano installati i seguenti elementi:

  • Visual Studio Ultimate

  • SDK di Visual Studio

  • Visualizzazione e modellazione SDK

Definizione di un comando o di un movimento in un nuovo progetto VSIX

Il metodo più rapido per la creazione di un'estensione consiste nell'utilizzare il modello di progetto.Tale approccio comporta l'inclusione del codice e del manifesto VSIX nello stesso progetto.

Per definire un'estensione tramite un modello di progetto

  1. Creare un progetto in una nuova soluzione utilizzando il comando Nuovo progetto del menu File.

  2. Nella finestra di dialogo Nuovo progetto, sotto Progetti di modello fare clic su Estensione di comando Progettazione livelli o Estensione di movimento Progettazione livelli.

    In base al modello viene creato un progetto contenente un piccolo esempio funzionante.

  3. Per testare l'estensione, premere CTRL+F5 o F5.

    Verrà avviata un'istanza sperimentale di Visual Studio.In questa istanza, creare un diagramma livello.L'estensione del comando o del movimento dovrebbe funzionare in questo diagramma.

  4. Chiudere l'istanza sperimentale e modificare il codice di esempio.Per ulteriori informazioni, vedere Esplorazione e aggiornamento di modelli di livello nel codice del programma.

  5. È possibile aggiungere più gestori comandi o movimenti allo stesso progetto.Per ulteriori informazioni, vedere una delle seguenti sezioni:

    Definizione di un comando di menu

    Definizione di un gestore movimenti

  6. Per installare l'estensione nell'istanza principale di Visual Studio o in un altro computer, individuare il file .vsix in bin\*.Copiarlo nel computer in cui si desidera installare l'estensione, quindi fare doppio clic su di esso.Per disinstallare l'estensione, utilizzare Gestione estensioni nel menu Strumenti.

Aggiunta di un comando o di un movimento a un progetto VSIX distinto

Se si desidera creare un progetto VSIX contenente validator dei livelli, comandi e altre estensioni, si consiglia di creare un progetto per la definizione dell'estensione VSIX e progetti distinti per i gestori.Per informazioni su altri tipi di estensioni di modello, vedere Estensione di modelli e diagrammi UML.

Per aggiungere estensioni del livello a un progetto VSIX distinto

  1. Creare un progetto Libreria di classi in una nuova soluzione di Visual Studio Ultimate o in una esistente.Nella finestra di dialogo Nuovo progetto fare clic su Visual C#, quindi su Libreria di classi.Questo progetto conterrà le classi dei gestori comandi o movimenti.

    [!NOTA]

    È possibile definire più classi dei gestori comandi o movimenti in una stessa libreria di classi, ma è consigliabile definire le classi per la convalida dei livelli in una libreria di classi distinta.

  2. Identificare o creare un progetto VSIX nella soluzione.Un progetto VSIX contiene un file denominato source.extension.vsixmanifest.Per aggiungere un progetto VSIX:

    1. Nella finestra di dialogo Nuovo progetto espandere Visual C#, fare clic su Extensibility, quindi su Progetto VSIX.

    2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto VSIX e scegliere Imposta come progetto di avvio.

    3. Fare clic su Seleziona versioni e assicurarsi che sia selezionato Visual Studio Ultimate.

  3. In source.extension.vsixmanifest, sotto Asset, aggiungere il progetto di gestore comandi o movimenti come componente MEF.

    1. Nella scheda Asset, scegliere Nuovo.

    2. Al Tipo, selezionare Microsoft.VisualStudio.MefComponent.

    3. In Origine selezionare Progetta nella soluzione corrente e selezionare il nome del progetto di gestore comandi o movimenti.

    4. Salvare il file.

  4. Tornare al progetto di gestore comandi o movimenti e aggiungere i riferimenti al progetto riportati di seguito.

Riferimento

Operazioni consentite

Program Filese\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Architecture Tools\ExtensibilityRuntime\Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll

Creare e modificare livelli.

Microsoft.VisualStudio.Uml.Interfaces

Creare e modificare livelli.

Microsoft.VisualStudio.ArchitectureTools.Extensibility

Modificare forme nei diagrammi.

System.ComponentModel.Composition

Definire componenti mediante Managed Extensibility Framework (MEF).

Microsoft.VisualStudio.Modeling.Sdk.11.0

Definire le estensioni di modello.

Microsoft.VisualStudio.Modeling.Sdk.Diagrams.11.0

Aggiornare forme e diagrammi.

  1. Modificare il file della classe nel progetto Libreria di classi C# per includervi il codice per l'estensione.Per ulteriori informazioni, vedere una delle seguenti sezioni:

    Definizione di un comando di menu

    Definizione di un gestore movimenti

    Vedere anche Esplorazione e aggiornamento di modelli di livello nel codice del programma.

  2. Per testare la funzionalità, premere CTRL+F5 o F5.Verrà aperta un'istanza sperimentale di Visual Studio.In questa istanza, creare o aprire un diagramma livello.

  3. Per installare l'estensione VSIX nell'istanza principale di Visual Studio o in un altro computer, individuare il file .vsix nella directory bin del progetto VSIX.Copiarlo nel computer in cui si desidera installare l'estensione VSIX.Fare doppio clic sul file VSIX in Esplora risorse (Esplora file in Windows 8).

    Per disinstallare l'estensione, utilizzare Gestione estensioni nel menu Strumenti.

Definizione di un comando di menu

È possibile aggiungere più definizioni di comando di menu allo stesso progetto di movimento o di comando esistente.Ogni comando è definito da una classe che dispone delle seguenti caratteristiche:

  • La classe viene dichiarata nel seguente modo:

    [LayerDesignerExtension]

    [Export(typeof(ICommandExtension))]

    public class ComandoLivello : ICommandExtension { ... }

  • Lo spazio dei nomi e il nome della classe non sono rilevanti.

  • Di seguito sono riportati i metodi che implementano ICommandExtension:

    • string Text {get;}: etichetta visualizzata nel menu.

    • void QueryStatus(IMenuCommand command): chiamato quando l'utente fa clic con il pulsante destro del mouse sul diagramma, determina se il comando deve essere visibile e abilitato per la selezione corrente dell'utente.

    • void Execute(IMenuCommand command): chiamato quando l'utente seleziona il comando.

  • Per determinare la selezione corrente, è possibile importare IDiagramContext:

    [Import]

    public IDiagramContext DiagramContext { get; set; }

    ...

    DiagramContext.CurrentDiagram.SelectedShapes.Count()...

Per ulteriori informazioni, vedere Esplorazione e aggiornamento di modelli di livello nel codice del programma.

Per aggiungere un nuovo comando, creare un nuovo file di codice che contiene l'esempio riportato di seguito.Quindi, testarlo e modificarlo.

using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
using System.ComponentModel.Composition;
using System.Linq;

namespace MyLayerExtension // Change to your preference.
{
  // This is a feature for Layer diagrams:
  [LayerDesignerExtension]
  // This feature is a menu command:
  [Export(typeof(ICommandExtension))]
  // Change the class name to your preference:
  public class MyLayerCommand : ICommandExtension
  {
    [Import]
    public IDiagramContext DiagramContext { get; set; }

    [Import]
    public ILinkedUndoContext LinkedUndoContext { get; set; }

    // Menu command label:
    public string Text
    {
      get { return "Duplicate layers"; }
    }

    // Called when the user right-clicks the diagram.
    // Defines whether the command is visible and enabled.
    public void QueryStatus(IMenuCommand command)
    { 
      command.Visible = 
      command.Enabled = DiagramContext.CurrentDiagram
        .SelectedShapes.Count() > 0;
    }

    // Called when the user selects the command.
    public void Execute(IMenuCommand command)
    {
      // A selection of starting points:
      IDiagram diagram = this.DiagramContext.CurrentDiagram;
      ILayerModel lmodel = diagram.GetLayerModel();
      foreach (ILayer layer in lmodel.Layers)
      { // All layers in model.
      }
      // Updates should be performed in a transaction:
      using (ILinkedUndoTransaction t =
        LinkedUndoContext.BeginTransaction("copy selection"))
      {
        foreach (ILayer layer in 
          diagram.SelectedShapes
            .Select(shape=>shape.GetLayerElement())
            .Where(element => element is ILayer))
        {
          ILayer copy = lmodel.CreateLayer(layer.Name + "+");
          // Position the shapes:
          IShape originalShape = layer.GetShape();
          copy.GetShape().Move(
            originalShape.XPosition + originalShape.Width * 1.2,
            originalShape.YPosition);
        }
        t.Commit();
      }
    }
  }
}

Definizione di un gestore movimenti

Un gestore movimenti risponde quando l'utente trascina elementi nel diagramma livello e quando l'utente fa doppio clic in un punto qualsiasi del diagramma.

È possibile aggiungere al progetto VSIX del gestore comandi o movimenti esistente un file di codice che definisce un gestore movimenti:

using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
using System.ComponentModel.Composition;
using System.Linq;
namespace MyLayerExtensions // change to your preference
{
  [LayerDesignerExtension]
  [Export(typeof(IGestureExtension))]
  public class MyLayerGestureHandler : IGestureExtension
  {
  }
}

Tenere presenti le informazioni seguenti sui gestori movimenti:

  • I membri di IGestureExtension sono i seguenti:

    OnDoubleClick: chiamato quando l'utente fa doppio clic in un punto qualsiasi del diagramma.

    CanDragDrop: chiamato ripetutamente quando l'utente sposta il mouse durante il trascinamento di un elemento nel diagramma.Deve operare rapidamente.

    OnDragDrop: chiamato quando l'utente rilascia un elemento sul diagramma.

  • Il primo argomento di ciascun metodo è IShape, da cui è possibile ottenere l'elemento livello.Ad esempio:

            public void OnDragDrop(IShape target, IDataObject data)
            {
                ILayerElement element = target.GetLayerElement();
                if (element is ILayer)
                {
                    // ...
                }
            }
    
  • I gestori per alcuni tipi di elemento trascinato sono già definiti.Ad esempio, l'utente può trascinare elementi da Esplora soluzioni in un diagramma livello.Non è possibile definire un gestore del trascinamento per questi tipi di elemento.In questi casi, i metodi DragDrop non saranno richiamati.

Per ulteriori informazioni sulla decodifica di altri elementi trascinati nel diagramma, vedere Procedura: definire un gestore movimenti in un diagramma di modellazione.

Vedere anche

Concetti

Esplorazione e aggiornamento di modelli di livello nel codice del programma

Aggiunta di strumenti di convalida architettura personalizzati a diagrammi livelli

Procedura: definire e installare un'estensione di modellazione