Code Behind中的SkinID

时间:2009-06-07 12:01:37

标签: asp.net skinning

有没有办法在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?

由于

1 个答案:

答案 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
    }
}