0

有什么方法可以更改 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?

谢谢

4

1 回答 1

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
    }
}
于 2009-10-17T17:34:50.430 回答