Aggiungere il supporto a DesignTime per un custom control di ASP.NET con Template

di Marco Leoncini, in ASP.NET 2.0, Custom Control,

Nello script 915 abbiamo realizzato un WebControl col supporto all'utilizzo dei template.
Questa tecnica consente, senza ombra di dubbio, la realizzazione di web control adattabili ad ogni tipo di layout, dato che l'UI può essere definita di volta in volta.
Benché il controllo funzioni egregiamente, non fornisce un supporto adeguato a Design Time, essendo la definizione del template limitata solo alla vista 'Source'.
In questo script andremo ad aggiungere tale supporto realizzando un ControlDesigner custom.

Iniziamo creando una nuova classe utilizzando come classe base il tipo ControlDesigner, chiamiamo la classe MyControlDesigner, ed eseguiamo l'override del metodo Inizialize:

public override void Initialize(IComponent Component)
{
  base.Initialize(Component);

  //recupero l'istanza del controllo associato al designer
  _control = (GameView)Component;

  //abilito l'editing dei template
  SetViewFlags(ViewFlags.TemplateEditing, true);

}

Proseguiamo eseguendo l'override della proprietà TemplateGroups, in modo da restituire la collezione di definizioni di template da utilizzare a DesignTime:

public override TemplateGroupCollection TemplateGroups
{
  get
  {
    //la collezione restituita dalla proprietà
    TemplateGroupCollection _collection = new TemplateGroupCollection();

    //il gruppo dei template
    TemplateGroup _group = new TemplateGroup("Item");

    //creo una nuova definizione per il template
    TemplateDefinition _template = new TemplateDefinition(this, "My GameView", _control, "Template");

    //aggiungo la definizione al gruppo
    _group.AddTemplateDefinition(_template);

    //ed il gruppo alla collezione
    _collection.Add(_group);

    return _collection;
  }
}

L'onere di visualizzare lo smart tag a DesignTime, per abilitare la modifica del template, è gestito dall'oggetto TemplateDefinition.
È sufficiente, quindi, creare una nuova istanza passando al costruttore nell'ordine: il riferimento all'host (VS 2005/2008), il nome del template, il controllo che la definisce il template e il nome della proprietà che restituisce il riferimento all'oggetto ITemplate.
A questo punto è sufficiente decorare la classe del controllo in questo modo:

[Designer(typeof(MyControlDesigner))]
public class GameView : WebControl, INamingContainer
{
  //...
}

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi