ASP.Net fornece skins de tema, que na verdade são alterações de skin. Porém, muitas pessoas na Internet dizem que isso é inútil, dizendo que pode ser usado em páginas .aspx, mas não pode ser usado em páginas mestras (MasterPage). Sim, é verdade que você não pode mudar diretamente o tema de todo o site por meio de uma seleção DDL no MasterPage, porque a propriedade Page.Theme está definida em PreInit(){}, caso contrário, um erro será relatado e o MasterPage não será executado PréInit().
Espero que este exemplo possa ajudar todos a resolver este problema. Para que todos entendam melhor meu código-fonte, irei apresentá-lo brevemente a seguir.
Primeiro vamos falar da ideia: Nosso objetivo é colocar um DropDownList na MasterPage, trocando o DropDownList (não uso o DropDownList aqui, mas uso Css para simular um "DropDownList" no qual é colocado um LinkButton em cada item, e cada LinkButtond O valor de PostBackUrl está no formato: "~/ThemeTool.aspx?Theme=theme name" ) para alterar o tema de todo o site, ao invés de apenas alterar a página atual, assim como a do Discuz!, então essa mudança é global, mas é para o thread atual, ou seja, o usuário A muda o tema, que só tem efeito para o usuário A e não tem impacto no usuário B, então não vamos mexer no arquivo de configuração. pense rapidamente na sessão. Sim, precisamos colocar o nome do tema na sessão, como Session["Theme"]="Blue"; desta forma, cada página só precisa obter o valor da Session em Page_PreInit() e atribua-o ao atributo Page.Theme da página, e tudo ficará bem.
Quando alteramos a opção "DropDowList", aqui na verdade clico em um Linkbutton diferente, o que significa alterar o nome do tema, o que significa alterar o valor de Session["Theme"]. Isso é muito crítico. Está em LinkButton_Click()? Não, porque a readquirição de Page.Theme deve estar em Page_PreInit(), e LinkButton_Click() acontece muito tarde, após Load, quanto mais PreInit(), então pulo para ThemeTool Processado em .aspx e depois redireciono para a página original. após o processamento, para que o valor de Session["Theme"] seja alterado antes de PreInit() da página original, tenha certeza de que este processo não fará com que ThemeTool seja carregado no navegador. apenas peguei emprestado seu Page_PreInit() e saí imediatamente após usá-lo, haha! !
Ok, a ideia é essa, vamos apresentar os próximos três arquivos:
1. MasterPage.master, o que vale a pena mencionar neste arquivo é o meu "DropDownList" simulado com CSS. Cada item do "DropDownList" possui um LinkButton, e o valor do PostBackUrl de cada LinkButtond está no formato: " ~/ThemeTool. aspx?Theme=Nome do tema", de forma que toda vez que a opção "DropDownList" for alterada, um novo valor de Tema será passado para ThemeTool.aspx, e então ThemeTool.aspx processará o novo valor de Tema e o armazenará na Sessão. .
2. Há um arquivo ThemeSkin.cs na pasta App_Code, que contém dois métodos estáticos: GetTheme(Page P) e GetTheme(Page P) é usado para obter o tema. . É chamado em Page_PreInit() de toda página que precisa ter um tema (estou aqui Default.aspx e Default2.aspx l). O parâmetro P refere-se à página que chama o método, que é um objeto do tipo Page; ChangeTheme() é usado para mudar o tema é chamado em Page_PreInit() de ThemeTool.aspx.cs.
3. A página ThemeTool.aspx no diretório raiz também é muito importante. A troca de tema é feita em seu Page_PreInit. Quem disse ao MasterPage para não executar o PreInit? O código interno é muito simples. Se você não acredita em mim, dê uma olhada.
Expandir