This example demonstrates how to implement the Theme Selector control as shown in ASP.NET Web Forms Demos.
Overview
Follow the steps below to implement a theme selector:
- Copy files from the folders listed below to the corresponding folders in your application.
- 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>
- 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(); }
- 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
- ThemeGroupModel.cs (VB: ThemeGroupModel.vb)
- ThemeModel.cs (VB: ThemeModel.vb)
- ThemeModelBase.cs (VB: ThemeModelBase.vb)
- ThemesModel.cs (VB: ThemesModel.vb)
- Utils.cs (VB: Utils.vb)
- Default.aspx (VB: Default.aspx)
- Default.aspx.cs (VB: Default.aspx.vb)
- Global.asax (VB: Global.asax)
- MasterPage.master.cs (VB: MasterPage.master.vb)
- Script.js (VB: Script.js)
- ThemeParametersSelector.ascx (VB: ThemeParametersSelector.ascx)
- ThemeParametersSelector.ascx.cs (VB: ThemeParametersSelector.ascx.vb)
- ThemeSelector.ascx (VB: ThemeSelector.ascx)
- ThemeSelector.ascx.cs (VB: ThemeSelector.ascx.vb)
More Examples
Example Code
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>
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; }
}
}
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();
}
}
}
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; }
}
}
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);
}
}
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;
}
}
}
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>
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) {
}
}
Code<%@ Application Language="C#" %>
<script RunAt="server">
protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) {
DevExpress.Web.ASPxWebControl.GlobalTheme = Utils.CurrentTheme;
Utils.ResolveThemeParametes();
}
</script>
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;
})();
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>
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;
}
}
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>
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";
}
}