Condividi tramite


Aggiunta di comandi e movimenti a diagrammi livelli

Questo Feature Pack di Visual Studio 2010 consente di estendere i diagrammi livello di Visual Studio 2010 Ultimate definendo menu di scelta rapida, o menu contestuali, comandi e gestori movimenti. È possibile comprimere queste estensioni in un progetto VSIX (Visual Studio Integration Extension) da distribuire ad altri utenti di Visual Studio Ultimate. Per ulteriori informazioni, vedere Feature Pack 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

Se si desidera definire un metodo di convalida architetturale personalizzato, è opportuno definirlo in un progetto di Visual Studio distinto. È 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 i requisiti e le istruzioni relative all'installazione, vedere Requisiti in Creazione di estensioni per diagrammi livelli.

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 Contenuto, aggiungere il progetto di gestore comandi o movimenti come componente MEF.

    1. Fare clic su Aggiungi contenuto.

    2. In Seleziona un tipo di contenuto selezionare Componente MEF.

    3. In Selezionare un'origine fare clic su Progetto e selezionare il nome del progetto di gestore comandi o movimenti.

    4. Salvare il file.

  4. In Riferimenti fare clic su Aggiungi riferimento e selezionare il runtime per questo Feature Pack.

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

Riferimento

Operazioni consentite

Se è installato il Feature Pack di visualizzazione e modellazione di Microsoft Visual Studio 2010:

%LocalAppData%\Microsoft\VisualStudio\10.0\Extensions\Microsoft\Visualization and Modeling Feature Pack Runtime\1.0\Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.dll

NotaNota
%LocalAppData% corrisponde in genere a NomeUnità:\Users\NomeUtente\AppData\Local.In Windows XP e Windows 2003, utilizzare %AppData% anziché %LocalAppData%.

Se è installato Visual Studio 2010 Feature Pack 2:

…\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Visualization and Modeling Feature Pack Runtime\1.0\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.10.0

Definire le estensioni di modello.

Microsoft.VisualStudio.Modeling.Sdk.Diagrams.10.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. In Esplora risorse fare doppio clic sul file VSIX.

    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.ArchitectureTools.Extensibility.Uml; 
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

È 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.ArchitectureTools.Extensibility.Uml;
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 è un elemento ShapeElement. È possibile convertire questo elemento in un elemento IShape, che è un wrapper più pratico per la modellazione:

    IShape ishape = targetElement.CreateIShape();
    if (ishape is IDiagram) { ... }
    else { ILayerElement layerElement = s.GetLayerElement(); ... }
    
  • 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 del movimento in un diagramma di modellazione.

Vedere anche

Altre risorse

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

Cronologia delle modifiche

Data

Cronologia

Motivo

Dicembre 2010

Contenuto aggiornato per Visual Studio 2010 Feature Pack 2.

Miglioramento delle informazioni.