Styles dans les contrôles serveur
Les styles déterminent l'aspect visuel d'un contrôle. Si vous développez un contrôle qui prend en charge les styles, dérivez-le de System.Web.UI.WebControls.WebControl, qui expose les styles en tant que propriétés fortement typées (telles que Font, Height, Width, etc.) et fournit des méthodes pour l'utilisation de propriétés de style. Pour une vue d'ensemble des styles dans les contrôles ASP.NET, consultez le Démarrage rapide ASP.NET —> Web Forms ASP.NET —> Application d'un style aux contrôles.
La classe WebControl fournit deux techniques pour la prise en charge des styles :
- Exposition de propriétés de style fortement typées du type Style ou de types dérivés de System.Web.UI.WebControl.Style.
- Émission de styles en tant qu'attributs HTML par l'ajout de paires nom/valeur à la collection WebControl.Style. Les développeurs de contrôles ne doivent pas employer cette technique. Cette technique est fournie afin que les utilisateurs du contrôle puissent ajouter des styles que le contrôle n'expose pas en tant que propriétés fortement typées. L'utilisateur d'un contrôle peut définir des styles de cette manière à la fois par programme et par déclaration, ainsi qu'il est décrit dans le Démarrage rapide ASP.NET —> Web Forms ASP.NET —> Application d'un style aux contrôles.
Exposition de propriétés de style fortement typées
Un contrôle serveur Web (contrôle serveur qui dérive de WebControl) hérite de la propriété WebControl.ControlStyle, qui détermine le style typé pour le contrôle dans son ensemble. Le type de ControlStyle est Style, une classe qui encapsule une fonctionnalité liée au style, comme décrit ci-après.
Style possède des propriétés telles que Font, Height, Width, ForeColor, BackColor, et d'autres qui correspondent aux styles des feuilles de style en cascade (CSS, Cascading Style Sheet). WebControl expose ces propriétés de style en tant que propriétés de niveau supérieur en les déléguant aux sous-propriétés de sa propriété ControlStyle.
Style expose une méthode (Style.AddAttributesToRender) de rendu de styles en tant qu'attributs à un objet HtmlTextWriter. Cela permet à WebControl de déléguer le rendu de style à sa propriété ControlStyle.
Remarque Lorsque vous substituez la méthode Render de WebControl, vous devez vous assurer que la fonctionnalité de rendu de base fournie par WebControl est conservée. Par exemple, si vous substituez la méthode Render pour appeler directement la méthode Write sur l'instance HtmlTextWriter, vous perdez la fonctionnalité de rendu de style qui est générée dans WebControl. Consultez Rendu d'exemples d'un contrôle serveur pour obtenir un exemple de la technique recommandée pour la substitution de Render.
Style fournit des méthodes pour copier (CopyFrom) et fusionner (MergeWith) des styles. Pour obtenir un exemple utilisant ces méthodes, consultez Exemple de contrôle dépendant basé sur un modèle.
Style implémente l'interface IStateManager, qui fournit une fonctionnalité de gestion d'état, permettant ainsi à un contrôle de déléguer la gestion d'état à ses propriétés de style. Dans le cadre du contrat IStateManager, Style implémente des méthodes telles que LoadViewState, SaveViewState et TrackViewState. Style possède également un constructeur surchargé qui accepte un type StateBag en tant qu'argument. WebControl crée ControlStyle en passant ViewState au constructeur Style, permettant ainsi à son style de contrôle d'accéder à son état d'affichage. Pour obtenir un exemple de la façon de déléguer une gestion d'état personnalisée aux propriétés de style d'un contrôle, consultez Exemple de contrôle dépendant basé sur un modèle.
Si le type par défaut de la propriété ControlStyle est Style, un contrôle serveur Web peut définir son style de contrôle avec n'importe quelle classe qui dérive de Style en substituant la méthode WebControl.CreateControlStyle, comme le montre l'exemple suivant.
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
Outre le type Style de base, l'espace de noms System.Web.UI.WebControls fournit d'autres types de style, tels que TableStyle et TableItemStyle. Vous pouvez définir des styles fortement typés supplémentaires en dérivant du type Style (ou d'une classe qui dérive de Style) et en substituant ou en ajoutant des membres. Tout comme WebControl qui expose des sous-propriétés de Style en tant que propriétés de niveau supérieur, vous pouvez exposer des sous-propriétés de votre type de style personnalisé en tant que propriétés de niveau supérieur. Par exemple, Table définit ControlStyle en tant que TableStyle et expose des sous-propriétés de TableStyle (telles que CellPadding, CellSpacing et Gridlines) en tant que propriétés de niveau supérieur. Le fragment de code suivant extrait de Exemple de contrôle dépendant basé sur un modèle montre comment le contrôle personnalisé TemplatedList
expose la sous-propriété CellPadding de son ControlStyle en tant que propriété de niveau supérieur.
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
Les méthodes suivantes de WebControl permettent à l'utilisateur d'un contrôle de modifier la propriété ControlStyle du contrôle.
- La méthode WebControl.ApplyStyle copie un style spécifié vers ControlStyle et remplace les éléments existants.
- La méthode WebControl.MergeStyle fusionne un style spécifié avec ControlStyle, sans remplacer les éléments existants.
Pour obtenir des exemples utilisant ces méthodes, consultez Exemple de contrôle dépendant basé sur un modèle.
Exposition de propriétés de style supplémentaires pour des contrôles enfants
La propriété ControlStyle détermine le style global d'un contrôle serveur Web, mais un contrôle serveur Web composite (contrôle qui possède des contrôles enfants) peut également exposer des propriétés de style supplémentaires qui s'appliquent à ses contrôles enfants. Un contrôle doit implémenter une gestion d'état personnalisée afin de conserver ces styles supplémentaires entre les allers-retours au client. La procédure suivante décrit les principales étapes à exécuter pour fournir des styles supplémentaires.
Pour exposer des styles destinés aux contrôles enfants
Définissez une ou plusieurs propriétés qui dérivent de Style. Le contrôle personnalisé
TemplatedList,
décrit dans Exemple de contrôle dépendant basé sur un modèle, expose des styles supplémentaires, comme le montre le fragment de code ci-dessous. Notez que dans ce cas, lorsqu'un nouveau Style est créé, le ViewState du contrôle n'est pas passé au constructeur Style. Un ViewState du contrôle est passé au constructeur Style uniquement lors de la création de la propriété ControlStyle d'un contrôle ; il n'est transmis pour aucune autre propriété de type Style. Notez aussi que le contrôle délègue le suivi de l'état d'affichage à la propriété de style elle-même.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
Appliquez les styles aux contrôles enfants. Pour obtenir un exemple, consultez la méthode
PrepareControlHierarchy
dans Exemple de contrôle dépendant basé sur un modèle, qui montre également comment fusionner des styles. Vous devez appliquer des styles aux contrôles enfants dans la phase de rendu, comme l'illustre l'exemple, afin qu'ils ne deviennent pas persistants dans l'état d'affichage.Substituez la méthode SaveViewState pour enregistrer les propriétés de style supplémentaires dans ViewState. Dans la mesure où les objets Style gèrent leur propre état, un contrôle doit appeler SaveViewState pour ses propriétés de style afin d'obtenir les objets qui doivent être ajoutés à la propriété ViewState. L'exemple suivant extrait de Exemple de contrôle dépendant basé sur un modèle montre comment un contrôle délègue une gestion d'état personnalisée à ses propriétés de style.
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
Substituez la méthode LoadViewState pour personnaliser la restauration de propriétés de style supplémentaires à partir de ViewState. Les objets supplémentaires qui ont été ajoutés à ViewState doivent maintenant être extraits dans l'ordre où ils ont été ajoutés. L'exemple suivant extrait de Exemple de contrôle dépendant basé sur un modèle montre comment un contrôle délègue la restauration d'état personnalisée à ses propriétés de style.
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
Pour obtenir un exemple de contrôle qui expose les propriétés de style appliquées à ses contrôles enfants, consultez Exemple de contrôle dépendant basé sur un modèle.