using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Xml; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace FineUI.Examples { public partial class _default : PageBase { #region Page_Init protected void Page_Init(object sender, EventArgs e) { string menuType = "menu"; HttpCookie menuCookie = Request.Cookies["MenuStyle"]; if (menuCookie != null) { menuType = menuCookie.Value; } // 注册客户端脚本,服务器端控件ID和客户端ID的映射关系 JObject ids = GetClientIDS(btnExpandAll, btnCollapseAll, windowSourceCode, mainTabStrip); if (menuType == "accordion") { Accordion accordionMenu = InitAccordionMenu(); ids.Add("mainMenu", accordionMenu.ClientID); ids.Add("menuType", "accordion"); } else { Tree treeMenu = InitTreeMenu(); ids.Add("mainMenu", treeMenu.ClientID); ids.Add("menuType", "menu"); } ids.Add("theme", PageManager.Instance.Theme.ToString()); // 只在页面第一次加载时注册客户端用到的脚本 if (!Page.IsPostBack) { string idsScriptStr = String.Format("window.IDS={0};", ids.ToString(Newtonsoft.Json.Formatting.None)); PageContext.RegisterStartupScript(idsScriptStr); } } private Accordion InitAccordionMenu() { Accordion accordionMenu = new Accordion(); accordionMenu.ID = "accordionMenu"; accordionMenu.EnableFill = true; accordionMenu.ShowBorder = false; accordionMenu.ShowHeader = false; Region2.Items.Add(accordionMenu); XmlDocument xmlDoc = XmlDataSource1.GetXmlDocument(); XmlNodeList xmlNodes = xmlDoc.SelectNodes("/Tree/TreeNode"); foreach (XmlNode xmlNode in xmlNodes) { if (xmlNode.HasChildNodes) { AccordionPane accordionPane = new AccordionPane(); accordionPane.Title = xmlNode.Attributes["Text"].Value; accordionPane.Layout = Layout.Fit; accordionPane.ShowBorder = false; accordionPane.BodyPadding = "2px 0 0 0"; accordionMenu.Items.Add(accordionPane); Tree innerTree = new Tree(); innerTree.EnableArrows = true; innerTree.ShowBorder = false; innerTree.ShowHeader = false; innerTree.EnableIcons = false; innerTree.AutoScroll = true; accordionPane.Items.Add(innerTree); XmlDocument innerXmlDoc = new XmlDocument(); innerXmlDoc.LoadXml(String.Format("{0}", xmlNode.InnerXml)); // 绑定AccordionPane内部的树控件 innerTree.DataSource = innerXmlDoc; innerTree.DataBind(); // 重新设置每个节点的图标 ResolveTreeNode(innerTree.Nodes); } } return accordionMenu; } private Tree InitTreeMenu() { Tree treeMenu = new Tree(); treeMenu.ID = "treeMenu"; treeMenu.EnableArrows = true; treeMenu.ShowBorder = false; treeMenu.ShowHeader = false; treeMenu.EnableIcons = false; treeMenu.AutoScroll = true; Region2.Items.Add(treeMenu); // 绑定 XML 数据源到树控件 treeMenu.DataSource = XmlDataSource1; treeMenu.DataBind(); // 重新设置每个节点的图标 ResolveTreeNode(treeMenu.Nodes); return treeMenu; } private JObject GetClientIDS(params ControlBase[] ctrls) { JObject jo = new JObject(); foreach (ControlBase ctrl in ctrls) { jo.Add(ctrl.ID, ctrl.ClientID); } return jo; } #endregion #region Page_Load protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { InitMenuStyleButton(); InitLangMenuButton(); InitThemeMenuButton(); //// 显示源代码按钮 //btnSourceCode.OnClientClick = windowSourceCode.GetShowReference("./common/source.aspx?files=~/default.aspx;~/common/menu.xml;~/Web.config;~/Code/PageBase.cs;~/js/default.js;~/css/default.css"); } } private void InitMenuStyleButton() { string menuStyleID = "MenuStyleTree"; HttpCookie menuStyleCookie = Request.Cookies["MenuStyle"]; if (menuStyleCookie != null) { switch (menuStyleCookie.Value) { case "menu": menuStyleID = "MenuStyleTree"; break; case "accordion": menuStyleID = "MenuStyleAccordion"; break; } } SetSelectedMenuID(MenuStyle, menuStyleID); } private void InitLangMenuButton() { string langMenuID = "MenuLangZHCN"; string langValue = PageManager1.Language.ToString().ToLower(); switch (langValue) { case "zh_cn": langMenuID = "MenuLangZHCN"; break; case "zh_tw": langMenuID = "MenuLangZHTW"; break; case "en": langMenuID = "MenuLangEN"; break; } SetSelectedMenuID(MenuLang, langMenuID); } private void InitThemeMenuButton() { string themeMenuID = "MenuThemeBlue"; string themeValue = PageManager1.Theme.ToString().ToLower(); switch (themeValue) { case "blue": themeMenuID = "MenuThemeBlue"; break; case "gray": themeMenuID = "MenuThemeGray"; break; case "access": themeMenuID = "MenuThemeAccess"; break; case "neptune": themeMenuID = "MenuThemeNeptune"; break; } SetSelectedMenuID(MenuTheme, themeMenuID); } #endregion #region Event protected void MenuLang_CheckedChanged(object sender, CheckedEventArgs e) { // 单选框菜单按钮的CheckedChanged事件会触发两次,一次是取消选中的菜单项,另一次是选中的菜单项; // 不处理取消选中菜单项的事件,从而防止此函数重复执行两次 if (!e.Checked) { return; } string langValue = FineUI.Language.ZH_CN.ToString(); string langID = GetSelectedMenuID(MenuLang); switch (langID) { case "MenuLangZHCN": langValue = FineUI.Language.ZH_CN.ToString(); break; case "MenuLangZHTW": langValue = FineUI.Language.ZH_TW.ToString(); break; case "MenuLangEN": langValue = FineUI.Language.EN.ToString(); break; } SaveToCookieAndRefresh("Language", langValue); } protected void MenuTheme_CheckedChanged(object sender, CheckedEventArgs e) { // 单选框菜单按钮的CheckedChanged事件会触发两次,一次是取消选中的菜单项,另一次是选中的菜单项; // 不处理取消选中菜单项的事件,从而防止此函数重复执行两次 if (!e.Checked) { return; } string themeValue = FineUI.Theme.Neptune.ToString(); string themeID = GetSelectedMenuID(MenuTheme); switch (themeID) { case "MenuThemeNeptune": themeValue = FineUI.Theme.Neptune.ToString(); break; case "MenuThemeBlue": themeValue = FineUI.Theme.Blue.ToString(); break; case "MenuThemeGray": themeValue = FineUI.Theme.Gray.ToString(); break; case "MenuThemeAccess": themeValue = FineUI.Theme.Access.ToString(); break; } SaveToCookieAndRefresh("Theme", themeValue); } protected void MenuStyle_CheckedChanged(object sender, CheckedEventArgs e) { // 单选框菜单按钮的CheckedChanged事件会触发两次,一次是取消选中的菜单项,另一次是选中的菜单项; // 不处理取消选中菜单项的事件,从而防止此函数重复执行两次 if (!e.Checked) { return; } string menuValue = "menu"; string menuStyleID = GetSelectedMenuID(MenuStyle); switch (menuStyleID) { case "MenuStyleTree": menuValue = "tree"; break; case "MenuStyleAccordion": menuValue = "accordion"; break; } SaveToCookieAndRefresh("MenuStyle", menuValue); } private string GetSelectedMenuID(MenuButton menuButton) { foreach (MenuItem item in menuButton.Menu.Items) { if (item is MenuCheckBox && (item as MenuCheckBox).Checked) { return item.ID; } } return null; } private void SetSelectedMenuID(MenuButton menuButton, string selectedMenuID) { foreach (MenuItem item in menuButton.Menu.Items) { MenuCheckBox menu = (item as MenuCheckBox); if (menu != null && menu.ID == selectedMenuID) { menu.Checked = true; } else { menu.Checked = false; } } } private void SaveToCookieAndRefresh(string cookieName, string cookieValue) { HttpCookie cookie = new HttpCookie(cookieName, cookieValue); cookie.Expires = DateTime.Now.AddYears(1); Response.Cookies.Add(cookie); PageContext.Refresh(); } #endregion #region Tree /// /// 重新设置每个节点的图标 /// /// private void ResolveTreeNode(TreeNodeCollection nodes) { foreach (TreeNode node in nodes) { if (node.Nodes.Count == 0) { if (!String.IsNullOrEmpty(node.NavigateUrl)) { node.IconUrl = GetIconForTreeNode(node.NavigateUrl); } } else { ResolveTreeNode(node.Nodes); } } } /// /// 根据链接地址返回相应的图标 /// /// /// private string GetIconForTreeNode(string url) { url = url.ToLower(); int paramsIndex = url.IndexOf("?"); if (paramsIndex >= 0) { url = url.Substring(0, paramsIndex); } int lastDotIndex = url.LastIndexOf('.'); if (lastDotIndex >= 0) { url = url.Substring(lastDotIndex + 1); } string fileType = url; string iconUrl = "~/images/filetype/vs_unknow.png"; if (fileType == "txt") { iconUrl = "~/images/filetype/vs_txt.png"; } else if (fileType == "aspx") { iconUrl = "~/images/filetype/vs_aspx.png"; } else if (fileType == "htm" || fileType == "html") { iconUrl = "~/images/filetype/vs_htm.png"; } return iconUrl; } #endregion } }