有没有办法在codeBehind中更改skinId? 我在设置其他属性时尝试过,但它无法正常工作。皮肤没有涂抹。
public GlobalImageButtonType Skin {
get { return _skin; }
set
{
_skin = value;
this.SkinID = _skin.ToString();
this.CommandName = _skin.ToString();
LoadDefaultValues();
}
}
我也尝试过循环遍历page.contols,但是在page_onpreinit事件中,控件集合为空。
是否可以在aspx页面之外的其他位置更改SkinId?
由于
答案 0 :(得分:4)
SkinID 只能在 OnPreInit 之前或之前以编程方式更改 - 您为控件启动此操作的唯一选项是在页面的 OnPreInit 中。
在正常情况下, .Controls 应该在该阶段可用。
在某些情况下,您需要针对 .master 页面进行以下解决方法:
/*
* HACK: need to ensure master controls are instantiated first.
* */
MasterPage root = this.Master;
while (root.Master != null)
root = root.Master;
InvokeControlPreInit(Controls);
现在你可以拥有需要蒙皮的控件实现一些接口(IRuntimeSkinableControl),允许它们分配自己的皮肤:
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);
}
}
控件将如此应用:
public class UserControl : System.Web.UI.UserControl, IRuntimeSkinableControl
{
public virtual void OnPreInit()
{
//assign this.SkinID
}
}