2011-04-26 55 views
2

如何更改Page.Theme动态地UserControl主题在用户控制

据我所知,它可以在Page_PreInit,但UserControl没有这样的事件,它只存在于Page类中。

回答

3

MSDN says

使用主题属性时,您必须意识到一个限制 的。该 主题属性只能在 或PagePreInit事件之前设置。

用户控件生命周期页面的PreInit事件发生后立即启动,所以你将不能够直接从您的控制设定的主题。

但还是有一点点的解决方法:假定当前主题存储在会话对象中,你可以改变你的用户控件的任何地方本届值,那么就刷新页面例如通过在Page_PreInit处理程序使用Response.Redirect(Request.Url.AbsoluteUri)和更换主题:

这里是页的PreInit事件处理程序:

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    var theme = Session["Theme"] as string; 
    if (theme != null) 
    { 
     Page.Theme = theme; 
    } 
} 

和如在用户控件OnSelectedIndexChanged事件处理程序:

protected void ddlTheme_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    Session["Theme"] = ddlTheme.SelectedValue; 
    Response.Redirect(Request.Url.AbsoluteUri); 
} 
+0

的'的Response.Redirect(Request.Url.AbsoluteUri);'将给予我们一个无限循环。我们需要检查'如果(会话[“主题”]!= ddlTheme.SelectedValue)' – liron 2011-04-26 12:00:21

+0

是,'Response.Redirect'会,如果你在执行上的每一页处理的代码中使用它给你一个无限循环。在上面的例子中,假设要对仅回发执行。但是,是的,你说得对,价值需要检查。 – Alex 2011-04-26 12:04:50

0

在用户控制系统负载情况下,使用方法:

this.ApplyStyleSheetSkin(Page); 
+0

它'没有回答我的问题...我想从用户控件的动态的OnLoad更改主题。 'Page.Theme = “MyCustomTheme”;' – liron 2011-04-26 10:40:22