Example T590818
Visible to All Users

ASP.NET Web Forms Controls - How to implement the Theme Selector control shown in DevExpress Demos

This example demonstrates how to implement the Theme Selector control as shown in ASP.NET Web Forms Demos.

Theme Selector

Overview

Follow the steps below to implement a theme selector:

  1. Copy files from the folders listed below to the corresponding folders in your application.
  2. Register ThemeSelector and ThemeParametersSelector controls in the web.config file:
    ASPx
    <pages> <controls> <!-- ... --> <add src="~/UserControl/ThemeParametersSelector.ascx" tagName="ThemeParametersSelector" tagPrefix="dx" /> <add src="~/UserControl/ThemeSelector.ascx" tagName="ThemeSelector" tagPrefix="dx" /> </controls> </pages>
  3. Once a user selects a theme, the code example writes that theme to cookies [writes to cookies???]. To apply this theme, handle the Application.PreRequestHandlerExecute event in the Global.asax file as follows:
    C#
    protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) { DevExpress.Web.ASPxWebControl.GlobalTheme = Utils.CurrentTheme; Utils.ResolveThemeParametes(); }
  4. In the master page, add ThemeSelector and ThemeParametersSelector controls as follows:
    ASPx
    <form id="form1" runat="server"> <header> <dx:ASPxPanel runat="server" ClientInstanceName="TopPanel" CssClass="header-panel" FixedPosition="WindowTop" EnableTheming="false"> <PanelCollection> <dx:PanelContent> <a class="right-button icon cog right-button-toggle-themes-panel" href="javascript:void(0)" onclick="DXDemo.toggleThemeSettingsPanel(); return false;"></a> </dx:PanelContent> </PanelCollection> </dx:ASPxPanel> </header> <div class="main-content-wrapper"> <section class="top-panel clearfix top-panel-dark"> <dx:ASPxButton runat="server" Text="Change Theme Settings" CssClass="theme-settings-menu-button adaptive" EnableTheming="false" AutoPostBack="false" ImagePosition="Right" UseSubmitBehavior="false"> <Image SpriteProperties-CssClass="icon angle-down theme-settings-menu-button-image" /> <FocusRectBorder BorderWidth="0" /> <ClientSideEvents Click="DXDemo.toggleThemeSettingsPanel" /> </dx:ASPxButton> </section> <dx:ASPxPanel runat="server" ClientInstanceName="ThemeSettingsPanel" CssClass="theme-settings-panel" FixedPosition="WindowRight" Collapsible="true" EnableTheming="false" ScrollBars="Auto"> <SettingsCollapsing AnimationType="Slide" ExpandEffect="PopupToLeft" ExpandButton-Visible="false" /> <Styles> <ExpandBar Width="0" /> <ExpandedPanel CssClass="theme-settings-panel-expanded"></ExpandedPanel> </Styles> <PanelCollection> <dx:PanelContent> <div class="top-panel top-panel-dark clearfix"> <dx:ASPxButton runat="server" Text="Change Theme Settings" CssClass="theme-settings-menu-button" EnableTheming="false" AutoPostBack="false" ImagePosition="Right" HorizontalAlign="Left" UseSubmitBehavior="false"> <Image SpriteProperties-CssClass="icon angle-down theme-settings-menu-button-image" /> <FocusRectBorder BorderWidth="0" /> <ClientSideEvents Click="DXDemo.toggleThemeSettingsPanel" /> </dx:ASPxButton> </div> <div class="theme-settings-panel-content"> <dx:ThemeSelector ID="ThemeSelector" runat="server" /> <% if(Utils.CanApplyThemeParameters) { %> <dx:ThemeParametersSelector ID="ThemeParametersSelector" runat="server" /> <% } %> </div> </dx:PanelContent> </PanelCollection> </dx:ASPxPanel> </div> <div style="clear: both;"> <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </form>

Files to Review

More Examples

Example Code

MasterPage.master
Code
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %> <%@ Register Assembly="DevExpress.Web.v17.2, Version=17.2.18.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web" TagPrefix="dx" %> <!DOCTYPE html> <html> <head runat="server"> <title>How to use ThemeSelector</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <script src="Scripts/Script.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="~/Styles/StyleSheet.css" /> <link rel="stylesheet" type="text/css" href="~/Styles/sprite.css" /> <asp:ContentPlaceHolder ID="head" runat="server"> </asp:ContentPlaceHolder> </head> <body> <form id="form1" runat="server"> <header> <dx:ASPxPanel runat="server" ClientInstanceName="TopPanel" CssClass="header-panel" FixedPosition="WindowTop" EnableTheming="false"> <PanelCollection> <dx:PanelContent> <a class="right-button icon cog right-button-toggle-themes-panel" href="javascript:void(0)" onclick="DXDemo.toggleThemeSettingsPanel(); return false;"></a> </dx:PanelContent> </PanelCollection> </dx:ASPxPanel> </header> <div class="main-content-wrapper"> <section class="top-panel clearfix top-panel-dark"> <dx:ASPxButton runat="server" Text="Change Theme Settings" CssClass="theme-settings-menu-button adaptive" EnableTheming="false" AutoPostBack="false" ImagePosition="Right" UseSubmitBehavior="false"> <Image SpriteProperties-CssClass="icon angle-down theme-settings-menu-button-image" /> <FocusRectBorder BorderWidth="0" /> <ClientSideEvents Click="DXDemo.toggleThemeSettingsPanel" /> </dx:ASPxButton> </section> <dx:ASPxPanel runat="server" ClientInstanceName="ThemeSettingsPanel" CssClass="theme-settings-panel" FixedPosition="WindowRight" Collapsible="true" EnableTheming="false" ScrollBars="Auto"> <SettingsCollapsing AnimationType="Slide" ExpandEffect="PopupToLeft" ExpandButton-Visible="false" /> <Styles> <ExpandBar Width="0" /> <ExpandedPanel CssClass="theme-settings-panel-expanded"></ExpandedPanel> </Styles> <PanelCollection> <dx:PanelContent> <div class="top-panel top-panel-dark clearfix"> <dx:ASPxButton runat="server" Text="Change Theme Settings" CssClass="theme-settings-menu-button" EnableTheming="false" AutoPostBack="false" ImagePosition="Right" HorizontalAlign="Left" UseSubmitBehavior="false"> <Image SpriteProperties-CssClass="icon angle-down theme-settings-menu-button-image" /> <FocusRectBorder BorderWidth="0" /> <ClientSideEvents Click="DXDemo.toggleThemeSettingsPanel" /> </dx:ASPxButton> </div> <div class="theme-settings-panel-content"> <dx:ThemeSelector ID="ThemeSelector" runat="server" /> <% if(Utils.CanApplyThemeParameters) { %> <dx:ThemeParametersSelector ID="ThemeParametersSelector" runat="server" /> <% } %> </div> </dx:PanelContent> </PanelCollection> </dx:ASPxPanel> </div> <div style="clear: both;"> <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </form> </body> </html>
App_Code/ThemeGroupModel.cs(vb)
C#
using System; using System.Collections; using System.Collections.Generic; using System.Xml.Serialization; using System.Web.UI; public class ThemeGroupModel : ThemeModelBase { List<ThemeModel> _themes = new List<ThemeModel>(); string _float; [XmlElement(ElementName = "Theme")] public List<ThemeModel> Themes { get { return _themes; } set { _themes = value; } } [XmlAttribute] public string Float { get { return _float; } set { _float = value; } } }
App_Code/ThemeModel.cs(vb)
C#
using System; using System.Xml.Serialization; using System.Collections.Generic; using System.Web.UI; using System.Drawing; public class ThemeModel : ThemeModelBase { string _baseColor; string _fontFamily; string _fontSize; bool _showAsTop; string _previewColor; [XmlAttribute] public string BaseColor { get { if(String.IsNullOrEmpty(_baseColor)) return ""; return _baseColor; } set { _baseColor = value.ToUpper(); } } [XmlAttribute] public bool IsNew { get; set; } [XmlAttribute] public string FontFamily { get { if(String.IsNullOrEmpty(_fontFamily)) return ""; return _fontFamily; } set { _fontFamily = value; } } [XmlAttribute] public string FontSize { get { if(String.IsNullOrEmpty(_fontSize)) return ""; return _fontSize; } set { _fontSize = value; } } public string Font { get { var result = string.Empty; if(!string.IsNullOrEmpty(FontSize) && !string.IsNullOrEmpty(FontFamily)) result = string.Format("{0} {1}", FontSize, FontFamily); return result; } } [XmlAttribute] public bool ShowAsTop { get { return _showAsTop; } set { _showAsTop = value; } } [XmlAttribute] public string PreveiwColor { get { if(String.IsNullOrEmpty(_previewColor)) return ""; return _previewColor; } set { _previewColor = value.ToUpper(); } } }
App_Code/ThemeModelBase.cs(vb)
C#
using System; using System.Xml.Serialization; using System.Collections.Generic; public class ThemeModelBase { string _name; string _title; [XmlAttribute] public string Name { get { if(_name == null) return ""; return _name; } set { _name = value; } } [XmlAttribute] public string Title { get { if(_title == null) return ""; return _title; } set { _title = value; } } }
App_Code/ThemesModel.cs(vb)
C#
using System.Xml.Serialization; using System.Collections.Generic; using System.IO; using System.Web; using System.Linq; [XmlRoot("Themes")] public class ThemesModel { const string ResourceName = "DevExpress.Web.Demos.Data.Themes.xml"; static ThemesModel _current; static readonly object _currentLock = new object(); public static ThemesModel Current { get { lock(_currentLock) { if(_current == null) { using(Stream stream = File.OpenRead(HttpContext.Current.Server.MapPath("~/App_Data/Themes.xml"))) { XmlSerializer serializer = new XmlSerializer(typeof(ThemesModel)); _current = (ThemesModel)serializer.Deserialize(stream); } } return _current; } } } List<ThemeGroupModel> _groups = new List<ThemeGroupModel>(); public static IEnumerable<string> MobileThemes { get { return Current.Groups.First(g => g.Name == "Mobile").Themes.Select(t => t.Name); } } public static IEnumerable<ThemeModel> AllThemes { get { return Current.Groups.SelectMany(g => g.Themes); } } public static IEnumerable<ThemeModel> NewThemes { get { return AllThemes.Where(theme => theme.IsNew); } } public List<ThemeGroupModel> GetAllGroups() { var topThemes = AllThemes.Where(t => t.ShowAsTop).ToList(); var currentTheme = AllThemes.First(t => t.Name == Utils.CurrentTheme); if(!topThemes.Contains(currentTheme)) topThemes.Add(currentTheme); var firstGroup = new ThemeGroupModel() { Name = "FirstGroup", Themes = topThemes }; return Groups.Concat(new[] { firstGroup }).ToList(); } [XmlElement("ThemeGroup")] public List<ThemeGroupModel> Groups { get { return _groups; } } public List<ThemeGroupModel> LeftGroups { get { return (from g in Groups where g.Float == "Left" select g).ToList(); } } public List<ThemeGroupModel> RightGroups { get { return (from g in Groups where g.Float == "Right" select g).ToList(); } } public static ThemeModel GetThemeModel(string themeName) { return Current.Groups.SelectMany(g => g.Themes).FirstOrDefault(t => t.Name == themeName); } }
App_Code/Utils.cs(vb)
C#
using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.Configuration; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using DevExpress.Web.Internal; using System.Drawing; using DevExpress.Web; public static class Utils { internal const string CurrentThemeCookieKeyPrefix = "DXCurrentTheme", CurrentBaseColorCookieKeyPrefix = "DXCurrentBaseColor", TunableThemeCookieKeyPrefix = "DXTunableTheme", CurrentFontCookieKey = "DXCurrentFont", DefaultThemeName = "Metropolis"; public static string TunableThemeCookieKey { get { return TunableThemeCookieKeyPrefix; } } public static string DefaultTheme { get { return DefaultThemeName; } } public static List<ListEditItem> GetFontFamiliesDataSource() { return CustomFonts.Select(f => new ListEditItem() { Text = GetShortFontName(f), Value = f }).ToList(); } public static string GetDefaultBaseColor(string themeName) { return ThemesModel.GetThemeModel(themeName).BaseColor; } public static string CurrentBaseColorCookieKey { get { return CurrentBaseColorCookieKeyPrefix; } } static HttpContext Context { get { return HttpContext.Current; } } public static string[] CustomBaseColors { get { return new string[] { GetOrReplaceCurrentThemeDefaultBaseColor(), "#4796CE", "#35B86B", "#CE5B47", "#F7A233", "#9F47CE", "#5C57C9", "#CE4776", }; } } static Dictionary<string, string> ThemeBases = new Dictionary<string, string>() { { "MaterialCompact", "Material" } }; public static bool CanChangeTheme { get { return true; ; } } static HttpRequest Request { get { return Context.Request; } } public static string CurrentThemeCookieKey { get { return CurrentThemeCookieKeyPrefix; } } public static string CurrentTheme { get { if(CanChangeTheme && Request.Cookies[CurrentThemeCookieKey] != null) return HttpUtility.UrlDecode(Request.Cookies[CurrentThemeCookieKey].Value); return DefaultTheme; } } public static string GetOrReplaceCurrentThemeDefaultBaseColor() { if(ThemeBases.ContainsKey(CurrentTheme)) { var themeModel = ThemesModel.GetThemeModel(ThemeBases[CurrentTheme]); return themeModel.BaseColor; } return CurrentThemeDefaultBaseColor; } static ThemeModel CurrentThemeModel { get { return ThemesModel.Current.Groups.SelectMany(g => g.Themes).FirstOrDefault(t => t.Name == CurrentTheme); } } public static string[] CustomFonts { get { return new string[] { CurrentThemeDefaultFont, CurrentThemeDefaultFontSize + " " + "'Asap', normal", CurrentThemeDefaultFontSize + " " + "'Arima Madurai', normal", CurrentThemeDefaultFontSize + " " + "'Comfortaa', normal" }; } } public static string CurrentThemeDefaultFont { get { return CurrentThemeModel.Font; } } public static string CurrentThemeDefaultFontSize { get { return CurrentThemeModel.FontSize; } } public static string CurrentThemeDefaultBaseColor { get { return CurrentThemeModel.BaseColor; } } public static string CurrentFont { get { if(Request.Cookies[CurrentFontCookieKey] != null) return HttpUtility.UrlDecode(Request.Cookies[CurrentFontCookieKey].Value); return CurrentThemeDefaultFont; } } static bool IsThemeChanged { get { return CurrentTheme != TunableTheme; } } static string TunableTheme { get { if(Request.Cookies[TunableThemeCookieKey] != null) return HttpUtility.UrlDecode(Request.Cookies[TunableThemeCookieKey].Value); return CurrentTheme; } set { Context.Response.Cookies[TunableThemeCookieKey].Value = value; } } static void SetCurrentBaseColorCookie(string value) { if(string.IsNullOrWhiteSpace(value)) Request.Cookies.Remove(CurrentBaseColorCookieKey); else Request.Cookies[CurrentBaseColorCookieKey].Value = value; Context.Response.Cookies[CurrentBaseColorCookieKey].Value = value; } static void SetCurrentFontCookie(string value) { Context.Response.Cookies[CurrentFontCookieKey].Value = value; } public static bool CanApplyThemeParameters { get { return (!string.IsNullOrEmpty(CurrentThemeDefaultFont) || !string.IsNullOrEmpty(CurrentThemeDefaultBaseColor)); } } public static void ResolveThemeParametes() { if(!CanChangeTheme) return; string baseColor = CurrentBaseColor; string font = CurrentFont; if(IsThemeChanged || !string.IsNullOrEmpty(baseColor) && !CustomBaseColors.Contains(baseColor) || baseColor == CurrentThemeDefaultBaseColor) { baseColor = string.Empty; SetCurrentBaseColorCookie(baseColor); } if(IsThemeChanged || !string.IsNullOrEmpty(font) && !CustomFonts.Contains(font) || font == CurrentThemeDefaultFont) { font = string.Empty; SetCurrentFontCookie(font); } TunableTheme = CurrentTheme; ASPxWebControl.GlobalThemeBaseColor = baseColor; ASPxWebControl.GlobalThemeFont = font; } static string GetShortFontName(string fullName) { if(string.IsNullOrWhiteSpace(fullName)) return fullName; int indexOfFirstSpace = fullName.IndexOf(' '); int indexOfFirstComma = fullName.IndexOf(','); int endPosition = indexOfFirstComma > -1 ? indexOfFirstComma - 1 : fullName.Length - 1; return fullName.Substring(indexOfFirstSpace + 1, endPosition - indexOfFirstSpace).Trim('\''); } public static bool CanChangeBaseColor { get { return ThemesModel.Current.Groups.Where(g => g.Themes.Where(t => t.Name == CurrentTheme && !String.IsNullOrEmpty(t.BaseColor)).Count() != 0).Count() > 0; } } public static string GetColoredSquareUrl(string color) { var svg = "<svg xmlns='http://www.w3.org/2000/svg'><g><rect height='100%' width='100%' y='0' x='0' fill='" + color + "'/></g></svg>"; var svgEncoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(svg)); return "data:image/svg+xml;base64," + svgEncoded; } public static string CurrentBaseColor { get { if(Request.Cookies[CurrentBaseColorCookieKey] != null) return HttpUtility.UrlDecode(Request.Cookies[CurrentBaseColorCookieKey].Value); return CurrentThemeDefaultBaseColor; } } }
Default.aspx
ASPx
<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register Assembly="DevExpress.Web.v17.2, Version=17.2.18.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web" TagPrefix="dx" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> <dx:ASPxButton ID="ASPxButton1" runat="server" Text="ASPxButton"></dx:ASPxButton> </asp:Content>
Default.aspx.cs(vb)
C#
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { protected void Page_PreInit(object sender, EventArgs e) { } protected void Page_Load(object sender, EventArgs e) { } }
Global.asax
Code
<%@ Application Language="C#" %> <script RunAt="server"> protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) { DevExpress.Web.ASPxWebControl.GlobalTheme = Utils.CurrentTheme; Utils.ResolveThemeParametes(); } </script>
MasterPage.master.cs(vb)
C#
using DevExpress.Web.Internal; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class MasterPage : System.Web.UI.MasterPage { }
Scripts/Script.js
JavaScript
(function () { var DXDemo = {}; DXDemo.toggleNavigationPanel = function () { if (!window.NavigationPanel) return; if (window.innerWidth <= NavigationPanel.cpCollapseAtWindowInnerWidth) { if (!NavigationPanel.GetVisible()) NavigationPanel.SetVisible(true); NavigationPanel.Toggle(); } else { NavigationPanel.SetVisible(!NavigationPanel.GetVisible()); ASPx.GetControlCollection().ProcessControlsInContainer(document.getElementById('DemoArea'), function (control) { control.AdjustControl(); }); } DXDemo.adjustDemoSettingsBlock(); }; DXDemo.toggleThemeSettingsPanel = function () { if (!window.ThemeSettingsPanel) return; ThemeSettingsPanel.Toggle(); }; DXDemo.CurrentThemeCookieKey = "DXCurrentTheme"; DXDemo.CurrentBaseColorCookieKey = "DXCurrentBaseColor"; DXDemo.CurrentAdaptiveThemeCookieKey = "DXCurrentAdaptiveTheme"; DXDemo.CurrentAdaptiveBaseColorCookieKey = "DXCurrentAdaptiveBaseColor"; DXDemo.CurrentFontCookieKey = "DXCurrentFont"; DXDemo.SetCurrentAdaptiveTheme = function (theme) { ASPxClientUtils.SetCookie(DXDemo.CurrentAdaptiveThemeCookieKey, theme); forceReloadPage(); } DXDemo.SetCurrentTheme = function (theme) { ASPxClientUtils.SetCookie(DXDemo.CurrentThemeCookieKey, theme); forceReloadPage(); } DXDemo.OnShowAllThemesClick = function () { var themesListsNames = ShowAllThemesButton.cpThemesListsNames; for (var i = 0; i < themesListsNames.length; i++) { var themesList = window[themesListsNames[i]]; themesList.SetVisible(!themesList.GetVisible()); } var showAllThemesText = 'Show All Themes'; var showTopThemesText = 'Show Top Themes'; ShowAllThemesButton.SetText(ShowAllThemesButton.GetText() != showAllThemesText ? showAllThemesText : showTopThemesText); } DXDemo.OnThemesListSelectedIndexChanged = function (sender) { var selectedThemeName = sender.GetSelectedItem().value; if (ShowAllThemesButton.cpCurrenTheme != selectedThemeName) DXDemo.SetCurrentTheme(selectedThemeName !== 'Default' ? selectedThemeName : ''); } DXDemo.OnThemesListInit = function (sender) { var mainElement = sender.GetMainElement(); var itemElements = Array.prototype.slice.call(mainElement.getElementsByClassName("item"), 0); var newItemElements = itemElements.filter(function (elem) { return sender.cpNewThemes.indexOf(elem.textContent.trim()) !== -1; }); newItemElements.forEach(function (itemElement) { if (itemElement.className.indexOf("new-item") === -1) itemElement.className += " new-item"; }); }, DXDemo.SetCurrentFont = function (font) { ASPxClientUtils.SetCookie(DXDemo.CurrentFontCookieKey, font); forceReloadPage(); } DXDemo.SetCurrentAdaptiveBaseColor = function (color) { ASPxClientUtils.SetCookie(DXDemo.CurrentAdaptiveBaseColorCookieKey, color); forceReloadPage(); } DXDemo.SetCurrentBaseColor = function (color) { ASPxClientUtils.SetCookie(DXDemo.CurrentBaseColorCookieKey, color); forceReloadPage(); } forceReloadPage = function () { if (document.forms[0] && (!document.forms[0].onsubmit || (document.forms[0].onsubmit.toString().indexOf("Sys.Mvc.AsyncForm") == -1 && !document.forms[0].hasAttribute("data-ajax")))) { // for export purposes var eventTarget = document.getElementById("__EVENTTARGET"); if (eventTarget) eventTarget.value = ""; var eventArgument = document.getElementById("__EVENTARGUMENT"); if (eventArgument) eventArgument.value = ""; document.forms[0].submit(); } else { window.location.reload(); } } DXDemo.iconButtonClick = function (s, e) { if (e.buttonIndex === 0) s.Focus(); } function selectorPopupContainerElement_Click(popupControl, event) { var eventSource = ASPx.Evt.GetEventSource(event); if (eventSource && eventSource.className.indexOf('dxpc-content') >= 0) { popupControl.HideWindow(); } } function DXSelectorPopupContainer_Init(sender) { var content = sender.GetWindowContentElement(-1); ASPxClientUtils.AttachEventToElement(content, 'click', function (event) { selectorPopupContainerElement_Click(sender, event); }); } function DXThemeSettingsPopupContainer_Init(sender) { var content = sender.GetWindowContentElement(-1); var themesButtonWrapper = content.querySelector(".themes-button-wrapper"); // ASPxClientUtils.AttachEventToElement(themesButtonWrapper, 'click', function(event) { ThemeParametersPopup.Hide(); ThemeSelectorPopup.Show(); }); } window.DXDemo = DXDemo; window.DXSelectorPopupContainer_Init = DXSelectorPopupContainer_Init; window.DXThemeSettingsPopupContainer_Init = DXThemeSettingsPopupContainer_Init; })();
UserControl/ThemeParametersSelector.ascx
Code
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ThemeParametersSelector.ascx.cs" Inherits="UserControl_ThemeParametersSelector" %> <div class="themes-parameters-container"> <% if(Utils.CanChangeBaseColor) { %> <dx:ASPxComboBox runat="server" ID="BaseColorEditor" Caption="Base Color" EnableTheming="false" TextField="Value" DropDownRows="8"> <ItemImage Height="18px" Width="18px" /> <ClientSideEvents SelectedIndexChanged="function(s){ DXDemo.SetCurrentBaseColor(s.GetSelectedItem().value); }" /> </dx:ASPxComboBox> <% } %> <dx:ASPxComboBox runat="server" ID="FontEditor" Caption="Font" TextField="Text" EnableTheming="false" CssClass="font-editor" > <Buttons> <dx:EditButton Image-SpriteProperties-CssClass="icon font" Position="Left" /> </Buttons> <ListBoxStyle CssClass="font-editor" /> <ItemImage SpriteProperties-CssClass="icon font" /> <ClientSideEvents SelectedIndexChanged="function(s){ DXDemo.SetCurrentFont(s.GetSelectedItem().value); }" ButtonClick="DXDemo.iconButtonClick" /> </dx:ASPxComboBox> </div>
UserControl/ThemeParametersSelector.ascx.cs(vb)
C#
using DevExpress.Web; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class UserControl_ThemeParametersSelector : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { if(Utils.CanChangeBaseColor) { BaseColorEditor.DataSource = Utils.CustomBaseColors.Select(c => new { Value = c, ImageUrl = Utils.GetColoredSquareUrl(c) }); BaseColorEditor.DataBind(); string currentBaseColor = string.IsNullOrWhiteSpace(Utils.CurrentBaseColor) ? Utils.GetDefaultBaseColor(Utils.CurrentTheme) : Utils.CurrentBaseColor; var item = BaseColorEditor.Items.FindByValue(currentBaseColor); if(item != null) item.Selected = true; } FontEditor.DataSource = Utils.GetFontFamiliesDataSource().Select(i => new { Value = i.Value, Text = i.Text, ImageUrl = "" }); FontEditor.DataBind(); FontEditor.SelectedIndex = !string.IsNullOrEmpty(ASPxWebControl.GlobalThemeFont) ? FontEditor.Items.IndexOfValue(ASPxWebControl.GlobalThemeFont) : 0; } protected void Page_Init(object sender, EventArgs e) { InitEditor(BaseColorEditor); InitEditor(FontEditor); } protected void InitEditor(ASPxComboBox editor) { editor.DropDownStyle = DropDownStyle.DropDownList; editor.ValueField = "Value"; editor.ImageUrlField = "ImageUrl"; editor.ShowImageInEditBox = true; editor.CssClass += " themes-parameters-editor"; editor.CaptionSettings.Position = EditorCaptionPosition.Top; editor.CaptionSettings.ShowColon = false; editor.CaptionStyle.CssClass = "themes-parameters-caption"; editor.ListBoxStyle.CssClass += " themes-parameters-listbox"; editor.ButtonStyle.CssClass = "themes-parameters-button-edit"; editor.DropDownButton.Image.SpriteProperties.CssClass = "icon drop-down"; editor.DropDownButton.Image.Height = 12; editor.DropDownButton.Image.Width = 12; } }
UserControl/ThemeSelector.ascx
Code
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ThemeSelector.ascx.cs" Inherits="UserControl_ThemeSelector" %> <dx:ASPxLabel runat="server" Text="Themes" CssClass="themes-caption"></dx:ASPxLabel> <asp:Repeater runat="server" ID="ThemesContainerRepeater" EnableViewState="false" DataSource="<%# ThemesModel.Current.GetAllGroups() %>"> <ItemTemplate> <dx:ASPxListBox runat="server" CssClass="themes-list" Width="100%" Caption="Themes" CaptionSettings-Position="Top" ValueField="Value" TextField="Text" ImageUrlField="ImageUrl" OnDataBinding="ThemesList_DataBinding" EnableCallbackMode="false" OnPreRender="ThemesLists_PreRender"> <CaptionCellStyle CssClass="themes-list-caption-cell" /> <ItemImage Height="18px" Width="18px" /> <CaptionSettings ShowColon="false" /> <CaptionStyle CssClass="themes-list-caption" /> <ItemStyle CssClass="item" SelectedStyle-CssClass="item-selected" HoverStyle-CssClass="item-hover" /> <ClientSideEvents SelectedIndexChanged="DXDemo.OnThemesListSelectedIndexChanged" Init="DXDemo.OnThemesListInit" /> </dx:ASPxListBox> </ItemTemplate> </asp:Repeater> <dx:ASPxButton runat="server" ID="ShowAllThemesButton" ClientInstanceName="ShowAllThemesButton" Text="Show All Themes" Width="100%" AutoPostBack="false" CssClass="show-all-themes-button" HorizontalAlign="Left"> <FocusRectBorder BorderWidth="0" /> <Image SpriteProperties-CssClass="icon three-dots"/> <ClientSideEvents Click="function(){ DXDemo.OnShowAllThemesClick(); }" /> </dx:ASPxButton>
UserControl/ThemeSelector.ascx.cs(vb)
C#
using DevExpress.Web; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Script.Serialization; using System.Web.UI; using System.Web.UI.WebControls; public partial class UserControl_ThemeSelector : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { ThemesContainerRepeater.DataBind(); ShowAllThemesButton.JSProperties["cpThemesListsNames"] = ThemesModel.Current.GetAllGroups().Select(g => GetThemesListClientName(g.Name)).ToList(); ShowAllThemesButton.JSProperties["cpCurrenTheme"] = Utils.CurrentTheme; } protected void ThemesList_DataBinding(object sender, EventArgs e) { ASPxListBox themesList = (ASPxListBox)sender; RepeaterItem item = themesList.NamingContainer as RepeaterItem; if(item == null) return; ThemeGroupModel group = item.DataItem as ThemeGroupModel; BindThemesList(themesList, group); } void BindThemesList(ASPxListBox themesList, ThemeGroupModel group) { bool isFirstgroup = group.Name == "FirstGroup"; themesList.Caption = group.Title; if(isFirstgroup) themesList.CssClass += " firstGroup"; var dataSource = group.Themes.Select(t => new ListEditItem() { Value = GetThemeTitle(t.Name), Text = t.Title, ImageUrl = Utils.GetColoredSquareUrl(t.PreveiwColor), }).ToList(); themesList.ClientInstanceName = GetThemesListClientName(group.Name); themesList.ClientVisible = isFirstgroup; themesList.Items.Clear(); themesList.Items.AddRange(dataSource); } protected void ThemesLists_PreRender(object sender, EventArgs e) { ASPxListBox themesList = (ASPxListBox)sender; themesList.UnselectAll(); var selectedItem = themesList.Items.FindByValue(GetThemeTitle(Utils.CurrentTheme)); if(selectedItem != null) selectedItem.Selected = true; var jsSerializer = new JavaScriptSerializer(); themesList.JSProperties["cpNewThemes"] = themesList.Items.Cast<ListEditItem>() .Where(item => ThemesModel.NewThemes.Select(t => t.Title).Contains(item.Text)) .Select(item => item.Text); } string GetThemesListClientName(string groupName) { return "themesList" + groupName; } string GetThemeTitle(string themeName) { return !string.IsNullOrEmpty(themeName) ? themeName : "Default"; } }

Disclaimer: The information provided on DevExpress.com and affiliated web properties (including the DevExpress Support Center) is provided "as is" without warranty of any kind. Developer Express Inc disclaims all warranties, either express or implied, including the warranties of merchantability and fitness for a particular purpose. Please refer to the DevExpress.com Website Terms of Use for more information in this regard.

Confidential Information: Developer Express Inc does not wish to receive, will not act to procure, nor will it solicit, confidential or proprietary materials and information from you through the DevExpress Support Center or its web properties. Any and all materials or information divulged during chats, email communications, online discussions, Support Center tickets, or made available to Developer Express Inc in any manner will be deemed NOT to be confidential by Developer Express Inc. Please refer to the DevExpress.com Website Terms of Use for more information in this regard.