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 private string _menuType = "menu"; private bool _showOnlyNew = false; private int _examplesCount = 0; protected void Page_Init(object sender, EventArgs e) { HttpCookie menuCookie = Request.Cookies["MenuStyle_v4"]; if (menuCookie != null) { _menuType = menuCookie.Value; } // 从Cookie中读取是否仅显示最新示例 HttpCookie menuShowOnlyNew = Request.Cookies["ShowOnlyNew_v4"]; if (menuShowOnlyNew != null) { _showOnlyNew = Convert.ToBoolean(menuShowOnlyNew.Value); } if (_menuType == "accordion") { InitAccordionMenu(); } else { InitTreeMenu(); } if (_showOnlyNew) { leftPanel.Title = String.Format("最新示例({0})", _examplesCount); } else { leftPanel.Title = String.Format("全部示例({0})", _examplesCount); } } private Accordion InitAccordionMenu() { Accordion accordionMenu = new Accordion(); accordionMenu.ID = "accordionMenu"; accordionMenu.ShowBorder = false; accordionMenu.ShowHeader = false; leftPanel.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.ShowBorder = false; innerTree.ShowHeader = false; innerTree.EnableIcons = true; innerTree.AutoScroll = true; innerTree.EnableSingleClickExpand = true; accordionPane.Items.Add(innerTree); XmlDocument doc = new XmlDocument(); doc.LoadXml(String.Format("{0}", xmlNode.InnerXml)); ResolveXmlDocument(doc); // 绑定AccordionPane内部的树控件 innerTree.NodeDataBound += treeMenu_NodeDataBound; innerTree.PreNodeDataBound += treeMenu_PreNodeDataBound; innerTree.DataSource = doc; innerTree.DataBind(); } } return accordionMenu; } private Tree InitTreeMenu() { Tree treeMenu = new Tree(); treeMenu.ID = "treeMenu"; treeMenu.ShowBorder = false; treeMenu.ShowHeader = false; treeMenu.EnableIcons = true; treeMenu.AutoScroll = true; treeMenu.EnableSingleClickExpand = true; leftPanel.Items.Add(treeMenu); XmlDocument doc = XmlDataSource1.GetXmlDocument(); ResolveXmlDocument(doc); // 绑定 XML 数据源到树控件 treeMenu.NodeDataBound += treeMenu_NodeDataBound; treeMenu.PreNodeDataBound += treeMenu_PreNodeDataBound; treeMenu.DataSource = doc; treeMenu.DataBind(); return treeMenu; } #region ResolveXmlDocument private void ResolveXmlDocument(XmlDocument doc) { ResolveXmlDocument(doc, doc.DocumentElement.ChildNodes); } private int ResolveXmlDocument(XmlDocument doc, XmlNodeList nodes) { // nodes 中渲染到页面上的节点个数 int nodeVisibleCount = 0; foreach (XmlNode node in nodes) { // Only process Xml elements (ignore comments, etc) if (node.NodeType == XmlNodeType.Element) { XmlAttribute removedAttr; // 是否叶子节点 bool isLeaf = node.ChildNodes.Count == 0; // 所有过滤条件均是对叶子节点而言,而是否显示目录,要看是否存在叶子节点 if (isLeaf) { // 如果仅显示最新示例 if (_showOnlyNew) { XmlAttribute isNewAttr = node.Attributes["IsNew"]; if (isNewAttr == null) { removedAttr = doc.CreateAttribute("Removed"); removedAttr.Value = "true"; node.Attributes.Append(removedAttr); } } } // 存在子节点 if (!isLeaf) { // 递归 int childVisibleCount = ResolveXmlDocument(doc, node.ChildNodes); if (childVisibleCount == 0) { removedAttr = doc.CreateAttribute("Removed"); removedAttr.Value = "true"; node.Attributes.Append(removedAttr); } } removedAttr = node.Attributes["Removed"]; if (removedAttr == null) { nodeVisibleCount++; } } } return nodeVisibleCount; } #endregion /// /// 树节点的绑定后事件 /// /// /// private void treeMenu_NodeDataBound(object sender, TreeNodeEventArgs e) { // 是否叶子节点 bool isLeaf = e.XmlNode.ChildNodes.Count == 0; string isNewHtml = GetIsNewHtml(e.XmlNode); if (!String.IsNullOrEmpty(isNewHtml)) { e.Node.Text += isNewHtml; } if (isLeaf) { // 设置节点的提示信息 e.Node.ToolTip = e.Node.Text; } // 如果仅显示最新示例 并且 当前节点不是子节点,则展开当前节点 if (_showOnlyNew && !e.Node.Leaf) { e.Node.Expanded = true; } } /// /// 树节点的预绑定事件 /// /// /// private void treeMenu_PreNodeDataBound(object sender, TreePreNodeEventArgs e) { /* // 如果仅显示最新示例 if (showOnlyNew) { string isNewHtml = GetIsNewHtml(e.XmlNode); if (String.IsNullOrEmpty(isNewHtml)) { e.Cancelled = true; } } // 更新示例总数 if (e.XmlNode.ChildNodes.Count == 0) { examplesCount++; } */ // 是否叶子节点 bool isLeaf = e.XmlNode.ChildNodes.Count == 0; XmlAttribute removedAttr = e.XmlNode.Attributes["Removed"]; if (removedAttr != null) { e.Cancelled = true; } if (isLeaf && !e.Cancelled) { _examplesCount++; } } private string GetIsNewHtml(XmlNode node) { string result = String.Empty; XmlAttribute isNewAttr = node.Attributes["IsNew"]; if (isNewAttr != null) { if (Convert.ToBoolean(isNewAttr.Value)) { result = " New!"; } } return result; } #endregion #region Page_Load protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { InitMenuStyleButton(); InitLangMenuButton(); InitThemeMenuButton(); InitMenuShowOnlyNew(); litVersion.Text = FineUI.GlobalConfig.ProductVersion; litOnlineUserCount.Text = Application["OnlineUserCount"].ToString(); } } private void InitMenuShowOnlyNew() { cbxShowOnlyNew.Checked = _showOnlyNew; } private void InitMenuStyleButton() { string menuStyleID = "MenuStyleTree"; HttpCookie menuStyleCookie = Request.Cookies["MenuStyle_v4"]; 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); } 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; } } } #endregion } }