SkinID in codice sottostante
Domanda
non v'è alcun modo per cambiare SkinID in codebehind? Ho provato durante l'impostazione di altri beni, ma non sta funzionando. La pelle non viene applicata.
public GlobalImageButtonType Skin {
get { return _skin; }
set
{
_skin = value;
this.SkinID = _skin.ToString();
this.CommandName = _skin.ToString();
LoadDefaultValues();
}
}
Ho provato anche page.contols ciclo throught, ma in page_onpreinit evento viene raccolta controlli vuoto.
E 'possibile cambiare lo SkinID altrove che nella pagina aspx?
Grazie
Soluzione
SkinID possono essere modificati solo a livello di codice o prima di OnPreInit - l'unica opzione per avviare questo per un controllo è in della pagina OnPreInit .
In circostanze normali, .Controls dovrebbe essere disponibile in quella fase.
In alcuni casi, è necessario il seguente work-around per .Master pagine:
/*
* HACK: need to ensure master controls are instantiated first.
* */
MasterPage root = this.Master;
while (root.Master != null)
root = root.Master;
InvokeControlPreInit(Controls);
È ora possibile avere controlli che devono scuoiatura attuare alcune interfaccia (IRuntimeSkinableControl) che permette loro di assegnare la propria pelle:
private void InvokeControlPreInit(ControlCollection controls)
{
foreach (Control control in controls)
{
IRuntimeSkinableControl skinableControl;
if (null != (skinableControl = control as IRuntimeSkinableControl))
skinableControl.OnPreInit();
if (string.IsNullOrEmpty(control.SkinID) && control.Controls.Count > 0)
InvokeControlPreInit(control.Controls);
}
}
Il controllo si applicherebbe in questo modo:
public class UserControl : System.Web.UI.UserControl, IRuntimeSkinableControl
{
public virtual void OnPreInit()
{
//assign this.SkinID
}
}