Condividi tramite


Aggiunta di proprietà personalizzate a un diagramma livelli

Quando si scrive il codice delle estensioni per i diagrammi livello in Visual Studio Ultimate, è possibile archiviare i valori a qualsiasi elemento in un diagramma livello.I valori saranno permanenti quando il diagramma viene salvato e riaperto.È inoltre possibile rendere disponibili queste proprietà nella finestra Proprietà in modo da poter visualizzare e modificare gli utenti.Ad esempio, è possibile consentire agli utenti di specificare un'espressione regolare per ogni livello e scrivere il codice di convalida per verificare che i nomi delle classi in ogni livello viene conformassero al modello specificato dall'utente.

Proprietà non visibili all'utente

Se si desidera solo il codice per associare i valori a qualsiasi elemento in un diagramma livello, non è necessario definire un componente MEF.Esiste un dizionario denominato Properties in ILayerElement.Aggiungere semplicemente i valori marshalable al dizionario di qualsiasi elemento del livello.Saranno salvati come parte del diagramma livello.Per ulteriori informazioni, vedere Esplorazione e aggiornamento di modelli di livello nel codice del programma.

Proprietà che l'utente può modificare

Preparazione iniziale

Nota importanteImportante

Per eseguire le proprietà visualizzate, è necessario effettuare la seguente modifica in ogni computer in cui si desidera visualizzare le proprietà del livello sia visibile.

  1. Esecuzione tramite Blocco Note Esegui come amministratore.Aprire %ProgramFiles%\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Architecture Tools\ExtensibilityRuntime\extension.vsixmanifest

  2. Nell'elemento di Content, aggiungere:

    <MefComponent>Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer.Provider.dll</MefComponent>
  3. Nel menu Start di Windows, in Microsoft Visual Studio 2012, Strumenti di Visual Studio, aprire Prompt dei comandi per gli sviluppatori.

    Immettere:

    devenv /rootSuffix /updateConfiguration

    devenv /rootSuffix Exp /updateConfiguration

  4. Riavviare Visual Studio.

Assicurarsi che il codice sia in un progetto VSIX

Se la proprietà fa parte di un comando, un movimento, o un progetto di convalida, non è necessario aggiungere alcun elemento.Il codice per la proprietà personalizzata deve essere definita in un progetto di estensibilità di Visual Studio definito come componente MEF.Per ulteriori informazioni, vedere Aggiunta di comandi e movimenti a diagrammi livelli o Aggiunta di strumenti di convalida architettura personalizzati a diagrammi livelli.

Definire una proprietà personalizzata

Per creare una proprietà personalizzata, definire la classe come segue:

[Export(typeof(IPropertyExtension))]
public class MyProperty 
      : PropertyExtension<ILayerElement>
{
  // Implement the interface.
}

È possibile definire proprietà su ILayerElement o su una delle relative classi derivate, che includono:

  • ILayerModel: modello.

  • ILayer: ogni livello.

  • ILayerDependencyLink: collegamenti tra livelli.

  • ILayerComment

  • ILayerCommentLink

Per visualizzare le proprietà personalizzate

Nota importanteImportante

Le proprietà personalizzate vengono visualizzati solo se Esplora architettura è aperta prima di caricare il progetto di modello.È necessario l'aprire Esplora architettura e quindi arrestare e riavviare Visual Studio per visualizzare le proprietà personalizzate.Dal menu Architettura, scegliere Windows, Esplora architettura.

Per testare le proprietà personalizzate, premere F5 per avviare un'istanza sperimentale di Visual Studio.Creare un esempio dell'elemento del livello appropriato e selezionarlo.Verrà visualizzata la proprietà personalizzata nella Finestra Proprietà.

Esempio

Il codice seguente è un tipico esempio di descrittore di proprietà personalizzato.Definisce una proprietà booleana nel modello di livello (ILayerModel) che consente all'utente di fornire valori per un metodo di convalida personalizzato.

using System;
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;

namespace MyNamespace
{
  /// <summary>
  /// Custom properties are added to the Layer Designer via a custom
  /// Property Descriptor. We have to export this Property Descriptor
  /// using MEF to make it available in the Layer Designer.
  /// </summary>
  [Export(typeof(IPropertyExtension))]
  public class AllTypesMustBeReferencedProperty 
      : PropertyExtension<ILayerModel>
  {
    /// <summary>
    /// Each custom property must have a unique name. 
    /// Usually we use the full name of this class.
    /// </summary>
    public static readonly string FullName =
      typeof(AllTypesMustBeReferencedProperty).FullName;

    /// <summary>
    /// Construct the property. Notice the use of FullName.
    /// </summary>
    public AllTypesMustBeReferencedProperty()
            : base(FullName)
    {  }

    /// <summary>
    /// The display name is shown in the Properties window.
    /// We therefore use a localizable resource.
    /// </summary>
    public override string DisplayName
    {
      get { return Strings.AllTypesMustBeReferencedDisplayName; }
    }

    /// <summary>
    /// Description shown at the bottom of the Properties window.
    /// We use a resource string for easier localization.
    /// </summary>
    public override string Description
    {
      get { return Strings.AllTypesMustBeReferencedDescription; }
    }

    /// <summary>
    /// This is called to set a new value for this property. We must
    /// throw an exception if the value is invalid.
    /// </summary>
    /// <param name="component">The target ILayerElement</param>
    /// <param name="value">The new value</param>
    public override void SetValue(object component, object value)
    {
      ValidateValue(value);
      base.SetValue(component, value);
    }
    /// <summary>
    /// Helper to validate the value.
    /// </summary>
    /// <param name="value">The value to validate</param>
    private static void ValidateValue(object value)
    {  }

    public override Type PropertyType
    { get { return typeof(bool); } }

    /// <summary>
    /// The segment label of the properties window.
    /// </summary>
    public override string Category
    { 
      get
      {
        return Strings.AllTypesMustBeReferencedCategory;
      }
    }
  }
}

Vedere anche

Concetti

Estensione dei diagrammi livello