2009-06-07 41 views
0

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

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

       LoadDefaultValues(); 
      } 
     } 

我也尝试循环throught page.contols,但在page_onpreinit事件是控件集合空。

是否有可能在其他地方比在aspx页面更改SkinId?

感谢

回答

3

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 
    } 
} 
+0

提示+1。尽管如果你实际包含了自定义接口的实现,它会好一点。我花了一些时间才弄明白,但最终它成功了。 – NightOwl888 2011-10-20 19:58:10