Skip to main content

Dynamic Theme Switching - Creating User-Selectable Themes

Theme  :


A theme is a collection of property settings that allow you to define the look of pages and controls, and then apply the look consistently across pages in a Web application, across an entire Web application, or across all Web applications on a server.

Skins :


A skin file has the file name extension .skin and contains property settings for individual controls such as Button, Label, TextBox, or Calendar controls. Control skin settings are like the control markup itself, but contain only the properties you want to set as part of the theme.


Previous Post  I was Explained about the  jQuery - Allow Alphanumeric (Alphabets & Numbers) Characters in Textbox using JavaScript , Fileupload show selected file in label when file selected , Check for file size with JavaScript before uploading, Show jQuery UI Dialog Popup Window from Server Side ( Code Behind ) in ASP.Net , How to use the window.open()  method ,  CONFIRMATION BOX WITH YES NO BUTTONS USING AJAX MODAL POPUP EXTENDER IN ASP.NET , Highlight Gridview Row When CheckBox is Checked in Asp.Net using Jquery


I think it is usually a good design practice, with Framework 2.0 applications, to control as much as possible  with themes that consist of a CSS file, a Skin file, and whatever graphic files are required. 

 This allows for an entire site to change its appearance by just changing the theme.  I went a step beyond that and enabled this site to allow dynamic theme changes from the dropdown box on the page heading.  One of the choices is “NoTheme” so you can see the site as it is with no CSS or Skin applied.  I plan to go a step further soon and implement memory of the last theme the user chose so it can be redisplayed at the users’ next visit using the new Atlas  ProfileScriptService.
 
Implementing dynamic theme switching entails the following …
 
First develop all of the themes you want and put them all under the App_Themes folder in your ASP.Net project.
 
Create a class, call it SwitchPage, and put it in the App_code folder.  It would look like this…
 
public class SwitchPage : System.Web.UI.Page
{
    protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);
        if (Session["TheTheme"] == null)
        {
            Session.Add("TheTheme", "EasyHotel");
            Page.Theme = ((string)Session["TheTheme"]);
        }
        else
        {
            Page.Theme = ((string)Session["TheTheme"]);
        }
    }
}
 
In my case “
EasyHotel” is the name of my theme that I want to always display first.  What this does is set the page, 
to which this class belongs, to whatever is in Session[“TheTheme”].  The trick to make this work is to change the 
inherit statement on all of you aspx pages to inherit from SwitchPage instead of System.Web.UIPage.
 
The theme DropDown has to be connected to an ObjectDataSource that is bound to the following C# class that returns 
an List object…
 
public class ThemeSupplier
{
    
    public static List<Theme> GetThemes()
    {
        DirectoryInfo dInfo = new DirectoryInfo(System.Web.HttpContext.Current.Server.MapPath("App_Themes"));
        DirectoryInfo[] dArrInfo = dInfo.GetDirectories();
        List<Theme> list = new List<Theme>();
        foreach (DirectoryInfo sDirectory in dArrInfo)
        {
            Theme temp = new Theme(sDirectory.Name);
            list.Add(temp);
        }
        return list;
    }
    
}
 
ThemeSupplier is helped by the following helper class... to get theme names 
 
public class Theme
{
    private string _name;
    public string Name
    {
        get  { return _name; }
        set  { _name = value; }
    }
    public Theme(string name)
    {
        Name = name;
    }
}
 
Finally the following two events make the switch actually happen… In master Page 


 <asp:ObjectDataSource ID="ThemeDataSource" runat="server" SelectMethod="GetThemes"
                TypeName="ThemeManager"></asp:ObjectDataSource>
            <asp:RadioButtonList ID="strTheme" runat="server" DataTextField="name" DataValueField="name"
                OnSelectedIndexChanged="strTheme_SelectedIndexChanged" OnDataBound="strTheme_DataBound"
                DataSourceID="ThemeDataSource" AutoPostBack="true" RepeatDirection="Horizontal" />

 
   protected void 
strTheme_DataBound(object sender, EventArgs e)
    {
        ddlTheme.SelectedValue = Page.Theme;
    }
    protected void 
strTheme_SelectedIndexChanged(object sender, EventArgs e)
    {
        Session.Add("TheTheme", ddlTheme.SelectedValue);
        Server.Transfer(Request.FilePath);  //just start the page over
    }
 
I use a program named TopStyle to do CSS files.  I prefer it to Visual Studio but you might not.
 
The trick to doing Skin files is to add a page, call it Scratch.aspx, to your project.  Drag, for instance, a GridView 
onto it and then use VS design time to make it look just like you want your gridviews for a given theme to look.  Then 
paste the definition into your .Skin file and remove the id entry.  That way you are letting VS do a lot of the work for you.


Your Theme folder look like this :





Comments

Popular posts from this blog

ASP.NET e-Commerce website GridView with Product Listing

Introduction : E-Commerce web applications are everywhere these days, and many share a common set of functionality. In this article, I will show how to use the GridView and ListView controls to build a powerful product page with many of the features found on today's e-commerce sites. We'll build a bicycle store product grid using some free clip art bicycle images. The example files are user controls which can be easily added to a page. We're only using three images here to keep the size of the sample application small. In previously I was explained about  Sending Email from Asp.net With Dynamic Content  ,  How To Export gridview data to Excel/PDF , CSV Formates in asp.net C#  , How to print Specific Area in asp.net web page How To- Search records or data in gridview using jQuery  . A shopping cart application would require to display the products in a multi column grid, rather than a straight down list or a table. The each item in a product grid would have

How to hide url parameters in asp.net

There are different ways to Hide the URL in asp.net , you can choose any one from bellow options . Previously I was Explained about the  Difference between Convert.tostring and .tostring() method Example  ,   Reasons to use Twitter Bootstrap , How to Register AJAX toolkit in web.config file in asp.net a) Using Post Method b) Using Of Session . c) URL Encoding & decoding process . d) Using Server.Transfer() instead of Response.Redirect() method (1)Use a form and POST the information. This might require additional code in source pages, but should not require logic changes in the target pages (merely change Request.QueryString to Request.Form). While POST is not impossible to muck with, it's certainly less appealing than playing with QueryString parameters. (2)Use session variables to carry information from page to page. This is likely a more substantial effort compared to (1), because you will need to take session variable checking into account (e.g. the

Asp.Net AjaxFileUpload Control With Drag Drop And Progress Bar

This Example explains how to use AjaxFileUpload Control With Drag Drop And Progress Bar Functionality In Asp.Net 2.0 3.5 4.0 C# And VB.NET. Previous Post  I was Explained about the   jQuery - Allow Alphanumeric (Alphabets & Numbers) Characters in Textbox using JavaScript  ,  Fileupload show selected file in label when file selected  ,  Check for file size with JavaScript before uploading  . May 2012 release of AjaxControlToolkit includes a new AjaxFileUpload Control  which supports Multiple File Upload, Progress Bar and Drag And Drop functionality. These new features are supported by Google Chrome version 16+, Firefox 8+ , Safari 5+ and Internet explorer 10 + , IE9 or earlier does not support this feature. To start with it, download and put latest AjaxControlToolkit.dll in Bin folder of application, Place ToolkitScriptManager  and AjaxFileUpload on the page. HTML SOURCE < asp:ToolkitScriptManager ID ="ToolkitScriptManager1" runat =&quo