Stili nei controlli server

Gli stili determinano l'aspetto visivo di un controllo. Se si intende sviluppare un controllo che supporta stili, eseguire una derivazione da System.Web.UI.WebControls.WebControl, che espone gli stili come proprietà tipizzata in modo sicuro, ad esempio Font, Height, Width e così via, e mette a disposizione metodi per lavorare con le proprietà di stile. Per una descrizione generale degli stili nei controlli di ASP.NET, vedere Guida rapida di ASP.NET —> Web Form ASP.NET —> Applicazione di stili a controlli.

La classe WebControl offre due tecniche per il supporto di stili:

  • Esposizione di proprietà di stile con tipizzate in modo sicuro del tipo System.Web.UI.WebControl.Style oppure di tipi derivati da System.Web.UI.WebControl.Style.
  • Emissione di stili come attributi HTML tramite l'aggiunta di coppie di nome/valore all'insieme WebControl.Style. Questa tecnica è sconsigliata per gli sviluppatori di controlli. Viene messa a disposizione per consentire agli utenti del controllo di aggiungere stili che il controllo non espone come proprietà tipizzata in modo sicuro. In questo modo l'utente di un controllo può impostare stili sia a livello di codice che in modo dichiarativo, come descritto in Guida rapida di ASP.NET —> Web Form ASP.NET —> Applicazione di stili a controlli.

Esposizione di proprietà di stile tipizzate in modo sicuro

Un controllo server Web, ovvero un controllo server che deriva da WebControl, eredita la proprietà WebControl.ControlStyle che determina lo stile tipizzato per l'intero controllo. Il tipo di ControlStyle è Style, ovvero una classe che incapsula funzionalità relative allo stile, come descritto nell'elenco seguente.

  • Style dispone di proprietà come Font, Height, Width, ForeColor, BackColor e altre che corrispondono a fogli di stile CSS. WebControl espone queste proprietà di stile come proprietà di livello superiore tramite la delega a sottoproprietà della proprietà ControlStyle.

  • Style espone il metodo Style.AddAttributesToRender per eseguire il rendering degli stili come attributi di un oggetto HtmlTextWriter. In tal modo si consente a WebControl di delegare il rendering dello stile alla proprietà ControlStyle.

    Nota   Quando si esegue l'override del metodo Render di WebControl, è necessario assicurarsi che la funzionalità di rendering di base offerta da WebControl sia mantenuta. Se, ad esempio, si esegue l'override del metodo Render per chiamare direttamente il metodo Write nell'istanza HtmlTextWriter, si perde la funzionalità di rendering dello stile incorporata in WebControl. Per un esempio della tecnica consigliata per eseguire l'override del metodo Render, vedere Esempi di esecuzione del rendering di un controllo server.

  • Style mette a disposizione metodi per la copia, ad esempio Style.CopyFrom, e l'unione di stili, ad esempio Style.MergeWith. Per un esempio in cui vengono utilizzati questi metodi, vedere Esempio di controllo basato su template con associazione a dati.

  • Style implementa l'interfaccia di IStateManager che offre funzionalità di gestione di stato e in tal modo consente a un controllo di delegare la gestione di stato alle proprietà di stile. In base al contratto IStateManager, Style implementa metodi come LoadViewState, SaveViewState e TrackViewState. Inoltre, Style dispone di un costruttore di overload che richiede un tipo StateBag come argomento. WebControl crea ControlStyle passando ViewState al costruttore Style, in tal modo consente allo stile del controllo di accedere allo stato di visualizzazione. Per un esempio di come delegare la gestione di stato personalizzata alle proprietà di stile di un controllo, vedere Esempio di controllo basato su template con associazione a dati.

Il tipo predefinito della proprietà ControlStyle è Style, mentre un controllo server Web può impostare lo stile di controllo con qualsiasi classe derivata da Style, se esegue l'override del metodo WebControl.CreateControlStyle, come illustrato nell'esempio seguente.

protected override Style CreateControlStyle() 
{
    // Note that the constructor of Style takes ViewState as an   
    // argument. 
    TableStyle style = new TableStyle(ViewState);
    // Set up default initial state.
    style.CellSpacing = 0;
    return style;
}
[Visual Basic]
Protected Overrides Function CreateControlStyle() As Style
    ' Note that the constructor of Style takes ViewState as an   
    ' argument. 
    Dim style As New TableStyle(ViewState)
    ' Set up default initial state.
    style.CellSpacing = 0
    Return style
End Function

Oltre al tipo di base Style, lo spazio dei nomi System.Web.UI.WebControls offre altri tipi di stile, ad esempio TableStyle e TableItemStyle È possibile definire ulteriori stili tipizzati in modo sicuro derivandoli da Style o da una classe derivata da Style e si esegue l'override o l'aggiunta di membri. Così come WebControl espone le sottoproprietà di Style come proprietà di livello superiore, è possibile esporre anche sottoproprietà del tipo di stile personalizzato come proprietà di livello superiore. Table, ad esempio, imposta la proprietà ControlStyle come TableStyle ed espone le sottoproprietà di TableStyle, ad esempio CellPadding, CellSpacing e Gridlines, come proprietà di livello superiore. Nel seguente frammento di codice dall'Esempio di controllo basto su template con associazione a dati viene illustrato come il controllo personalizzato TemplatedList espone la sottoproprietà CellPadding di ControlStyle come proprietà di livello superiore.

public virtual int CellPadding {
                  get {
                        if (ControlStyleCreated == false) {
                              return -1;
                        }
                        return ((TableStyle)ControlStyle).CellPadding;
                  }
                  set {
                        ((TableStyle)ControlStyle).CellPadding = value;
                  }
            } 
[Visual Basic]
Public Overridable Property CellPadding() As Integer
   Get
      If ControlStyleCreated = False Then
         Return - 1
      End If
      Return CType(ControlStyle, TableStyle).CellPadding
   End Get
   Set
      CType(ControlStyle, TableStyle).CellPadding = value
   End Set
End Property

I metodi seguenti di WebControl consentono all'utente di un controllo di modificare la proprietà ControlStyle del controllo.

  • Il metodo WebControl.ApplyStyle copia in ControlStyle uno stile specificato e sovrascrive gli elementi esistenti.
  • Il metodo WebControl.ApplyStyle unisce a ControlStyle uno stile specificato, senza sovrascrivere gli elementi esistenti.

Per esempi in cui vengono utilizzati questi metodi, vedere Esempio di controllo basato su template con associazione a dati.

Esposizione di ulteriori proprietà di stile per i controlli figlio

La proprietà ControlStyle determina lo stile generale di un controllo server Web, mentre un controllo server Web composto, ovvero un controllo con controlli figlio, può anche esporre ulteriori proprietà di stile che possono essere applicate ai controlli figlio. Un controllo deve implementare la gestione di stato personalizzata per mantenere gli stili aggiuntivi durante i cicli di andata e ritorno al client. Nell'elenco seguente vengono descritti i passaggi principali per mettere a disposizione questi stili aggiuntivi.

Per esporre stili per i controlli figlio

  1. Definire una o più proprietà che derivano da Style. Il controllo personalizzato TemplatedList, descritto in Esempio di controllo basato su template con associazione a dati, espone stili aggiuntivi, come illustrato nel frammento di codice seguente. Si noti che in questo caso, quando viene creato un nuovo oggetto Style, la proprietà ViewState del controllo non viene passata al costruttore Style. La proprietà ViewState di un controllo viene passata al costruttore Style solo quando si crea una proprietà del controllo ControlStyle, non per le altre proprietà di tipo Style. Si noti inoltre che il controllo delega alla stessa proprietà Style l'intercettazione dello stato di visualizzazione.

    public virtual TableItemStyle AlternatingItemStyle {
                      get {
                            if (alternatingItemStyle == null) {
                                  alternatingItemStyle = new TableItemStyle();
                                  if (IsTrackingViewState)
                                        ((IStateManager)alternatingItemStyle).TrackViewState();
                            }
                            return alternatingItemStyle;
                      }
                }
    [Visual Basic]
    Public Overridable ReadOnly Property AlternatingItemStyle() As TableItemStyle
       Get
          If _alternatingItemStyle Is Nothing Then
             _alternatingItemStyle = New TableItemStyle()
             If IsTrackingViewState Then
                CType(_alternatingItemStyle, IStateManager).TrackViewState()
             End If
          End If
          Return _alternatingItemStyle
       End Get
    End Property
    
  2. Applicare gli stili ai controlli figlio. Per un esempio, vedere il metodo PrepareControlHierarchy in Esempio di controllo basato su template con associazione a dati, in cui viene inoltre mostrato come unire gli stili. È consigliabile applicare stili ai controlli figlio in fase di rendering, come illustrato nell'esempio, affinché non vengano mantenuti nello stato di visualizzazione.

  3. Eseguire l'override del metodo SaveViewState per salvare le proprietà di stile aggiuntive in ViewState. Poiché gli oggetti Style gestiscono lo stato, un controllo deve chiamare SaveViewState nelle proprietà Style per ottenere gli oggetti che è necessario aggiungere alla proprietà ViewState. Nell'esempio seguente tratto da Esempio di controllo basato su template con associazione a dati viene illustrato come un controllo delega la gestione di stato personalizzata alle proprietà di stile.

    protected override object SaveViewState() 
    {
        // Customized state management to handle saving 
        // state of contained objects such as styles.
        object baseState = base.SaveViewState();
        object itemStyleState = (itemStyle != null) ? 
            ((IStateManager)itemStyle).SaveViewState() : null;
        object selectedItemStyleState = (selectedItemStyle != null) ? 
            ((IStateManager)selectedItemStyle).SaveViewState() : null;
        object alternatingItemStyleState = (alternatingItemStyle != null) ? 
            ((IStateManager)alternatingItemStyle).SaveViewState() : null;
    
        object[] myState = new object[4];
        myState[0] = baseState;
        myState[1] = itemStyleState;
        myState[2] = selectedItemStyleState;
        myState[3] = alternatingItemStyleState;
    
        return myState;
    }
    [Visual Basic]
    Protected Overrides Function SaveViewState() As Object
        ' Customized state management to handle saving 
        ' state of contained objects such as styles.
        Dim baseState As Object = MyBase.SaveViewState()
        Dim itemStyleState As Object 
        Dim selectedItemStyleState As Object
        Dim alternatingItemStyleState As Object
    
        If Not (_itemStyle Is Nothing) Then 
            itemStyleState = CType(_itemStyle, IStateManager).SaveViewState()
        Else
            itemStyleState = Nothing
        End If
    
        If Not (_selectedItemStyle Is Nothing) Then
            selectedItemStyleState = CType(_selectedItemStyle, IStateManager).SaveViewState()
        Else
           selectedItemStyleState = Nothing
        End If
    
        If Not (_alternatingItemStyle Is Nothing) Then
            alternatingItemStyleState = CType(_alternatingItemStyle, IStateManager).SaveViewState()
        Else
            alternatingItemStyleState = Nothing
        End If
    
        Dim myState(4) As Object
        myState(0) = baseState
        myState(1) = itemStyleState
        myState(2) = selectedItemStyleState
        myState(3) = alternatingItemStyleState
    
        Return myState
    End Function
    
  4. Eseguire l'override del metodo LoadViewState per personalizzare il ripristino delle proprietà di stile aggiuntive da ViewState. A questo punto è necessario recuperare gli oggetti aggiuntivi che erano stati aggiunti a ViewState, nello stesso ordine con cui erano stati aggiunti. Nell'esempio seguente tratto da Esempio di controllo basato su template con associazione a dati viene illustrato come un controllo delega il ripristino di stato personalizzato alle proprietà di stile.

    protected override void LoadViewState(object savedState) 
    {
        // Customized state management to handle 
        // state restoration of contained objects.
    
        if (savedState != null) 
        {
            object[] myState = (object[])savedState;
    
            if (myState[0] != null)
                base.LoadViewState(myState[0]);
            if (myState[1] != null)
                ((IStateManager)ItemStyle).LoadViewState(myState[1]);
            if (myState[2] != null)
                ((IStateManager)SelectedItemStyle).LoadViewState(myState[2]);
            if (myState[3] != null)
                ((IStateManager)AlternatingItemStyle).LoadViewState(myState[3]);
        }
    }
    [Visual Basic]
    Protected Overrides Sub LoadViewState(savedState As Object)
        ' Customized state management to handle saving 
        ' state of contained objects.
        If Not (savedState Is Nothing) Then
            Dim myState As Object() = CType(savedState, Object())
    
            If Not (myState(0) Is Nothing) Then
                MyBase.LoadViewState(myState(0))
            End If
            If Not (myState(1) Is Nothing) Then
                CType(ItemStyle, IStateManager).LoadViewState(myState(1))
            End If
            If Not (myState(2) Is Nothing) Then
                CType(SelectedItemStyle, IStateManager).LoadViewState(myState(2))
            End If
            If Not (myState(3) Is Nothing) Then
                CType(AlternatingItemStyle, IStateManager).LoadViewState(myState(3))
            End If
        End If
    End Sub
    

Per un esempio di un controllo in cui vengono esposte le proprietà di stile applicate ai controlli figlio, vedere Esempio di controllo basato su template con associazione a dati.

Vedere anche

Esempio di controllo basato su template con associazione a dati