Asp.net 代码隐藏中的SkinID

Asp.net 代码隐藏中的SkinID,asp.net,skinning,Asp.net,Skinning,有没有办法在codeBehind中更改skinId? 我在设置其他属性时尝试过,但不起作用。皮肤不适用 public GlobalImageButtonType Skin { get { return _skin; } set { _skin = value; this.SkinID = _skin.ToString(); th

有没有办法在codeBehind中更改skinId? 我在设置其他属性时尝试过,但不起作用。皮肤不适用

public GlobalImageButtonType Skin {
            get { return _skin; }
            set 
            {
                _skin = value;
                this.SkinID = _skin.ToString();
                this.CommandName = _skin.ToString();

                LoadDefaultValues();
            }
        }
我还尝试了遍历page.contols,但在page_onpreinit中,事件是controls集合为空

是否可以在aspx页面以外的其他位置更改SkinId


感谢

只能在OnPreInit上或之前以编程方式更改SkinID-控件启动此操作的唯一选项是页面的OnPreInit

在正常情况下,控件应在该阶段可用

在某些情况下,您需要对.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
    }
}

SkinID只能在OnPreInit上或之前以编程方式更改-控件启动此操作的唯一选项是在页面的OnPreInit

在正常情况下,控件应在该阶段可用

在某些情况下,您需要对.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
    }
}

+小费1英镑。尽管如此,如果您实际包含自定义接口的实现,这会更好一些。我花了一些时间才弄明白,但最后效果很好。小费+1。尽管如此,如果您实际包含自定义接口的实现,这会更好一些。我花了一些时间才弄明白,但最后结果很好。