手風琴控件是一個用來展示多個面板的控件,這些面板同時只能展開一項(也可以一項都不展開),和選項卡控件TabStrip有異曲同工之妙。本章將會介紹手風琴控件的基本用法,並結合樹控件來制作站點菜單。
手風琴控件的基本用法
通過一個示例來展示手風琴控件的用法,先看下最終效果圖:
這個手風琴控件由三個面板組成,來看下ASPX標簽定義:
1: <ext:Accordion ID="Accordion1" Title="手風琴控件" runat="server" Width="300px" Height="450px"
2: EnableFill="true" ShowBorder="True" ActiveIndex="1">
3: <Panes>
4: <ext:AccordionPane ID="AccordionPane1" runat="server" Title="面板一" IconUrl="../images/16/1.png"
5: BodyPadding="2px 5px" ShowBorder="false">
6: <Items>
7: <ext:Label ID="Label1" Text="面板一中的文本" runat="server">
8: </ext:Label>
9: </Items>
10: </ext:AccordionPane>
11: // 省略其他面板...
12: </Panes>
13: </ext:Accordion>
這里有幾個屬性需要注意:
- EnableFill:子面板是否填充全部空間,否則的所有子面板會堆積在頂部
- ActiveIndex:默認選中的面板索引
而子面板(AccordionPane)和普通的Panel面板沒有區別,只不過ShowHeader屬性不可用(子面板的標題欄是一定會存在的)。
在來看下后台獲取展開面板的代碼:
1: protected void Button1_Click(object sender, EventArgs e)
2: {
3: Alert.ShowInTop(String.Format("當前展開的是第 {0} 個面板", Accordion1.ActiveIndex + 1));
4: }
手風琴+樹控件
官方示例的左側菜單使用的是樹控件,如下圖所示:
其前台標簽定義和后台綁定代碼如下所示:
1: <ext:Region ID="Region2" Split="true" EnableSplitTip="true" CollapseMode="Mini" Width="200px"
2: Margins="0 0 0 0" ShowHeader="true" Title="示例" EnableLargeHeader="false" Icon="Outline"
3: EnableCollapse="true" Layout="Fit" Position="Left" runat="server">
4: </ext:Region>
5: <asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/menu.xml"></asp:XmlDataSource>
1: protected void Page_Init(object sender, EventArgs e)
2: {
3: InitTreeMenu();
4: }
5:
6: private void InitTreeMenu()
7: {
8: Tree treeMenu = new Tree();
9: treeMenu.ID = "treeMenu";
10: treeMenu.EnableArrows = true;
11: treeMenu.ShowBorder = false;
12: treeMenu.ShowHeader = false;
13: treeMenu.EnableIcons = false;
14: treeMenu.AutoScroll = true;
15: Region2.Items.Add(treeMenu);
16:
17: // 綁定 XML 數據源到樹控件
18: treeMenu.DataSource = XmlDataSource1;
19: treeMenu.DataBind();
20: }
這里涉及的知識點有:
- 動態添加樹控件,在Page_Init中進行;
- 將樹控件綁定到XML數據源。
簡單看下XML文件的內容:
1: <?xml version="1.0" encoding="utf-8" ?>
2: <Tree>
3: <TreeNode Text="配置信息" SingleClickExpand="true">
4: <TreeNode Text="發布歷史" NavigateUrl="~/config/release_history.txt">
5: </TreeNode>
6: <TreeNode Text="版本發布周期" NavigateUrl="~/config/release_time_chart.htm" >
7: </TreeNode>
8: <TreeNode Text="配置 Web.config" NavigateUrl="~/config/modify_webconfig.htm" >
9: </TreeNode>
10: <TreeNode Text="內置圖標" NavigateUrl="~/config/icons.htm" >
11: </TreeNode>
12: <TreeNode Text="安裝工具箱" NavigateUrl="~/config/install_toolbox.htm" >
13: </TreeNode>
14: <TreeNode Text="IIS6中啟用GZIP壓縮" NavigateUrl="~/config/enable_gzip_iis6.htm" >
15: </TreeNode>
16: <TreeNode Text="AJAX 屬性列表" NavigateUrl="~/config/ajax.aspx" >
17: </TreeNode>
18: </TreeNode>
19: // 省略其他節點...
20: </Tree>
后來很多網友希望增加手風琴控件和樹控件的組合菜單,效果如下所示:
下面看下具體的實現代碼:
1: protected void Page_Init(object sender, EventArgs e)
2: {
3: InitAccordionMenu();
4: }
5:
6: private Accordion InitAccordionMenu()
7: {
8: Accordion accordionMenu = new Accordion();
9: accordionMenu.ID = "accordionMenu";
10: accordionMenu.EnableFill = true;
11: accordionMenu.ShowBorder = false;
12: accordionMenu.ShowHeader = false;
13: Region2.Items.Add(accordionMenu);
14:
15: XmlDocument xmlDoc = XmlDataSource1.GetXmlDocument();
16: XmlNodeList xmlNodes = xmlDoc.SelectNodes("/Tree/TreeNode");
17: foreach (XmlNode xmlNode in xmlNodes)
18: {
19: if (xmlNode.HasChildNodes)
20: {
21: AccordionPane accordionPane = new AccordionPane();
22: accordionPane.Title = xmlNode.Attributes["Text"].Value;
23: accordionPane.Layout = Layout.Fit;
24: accordionPane.ShowBorder = false;
25: accordionPane.BodyPadding = "2px 0 0 0";
26: accordionMenu.Items.Add(accordionPane);
27:
28: Tree innerTree = new Tree();
29: innerTree.EnableArrows = true;
30: innerTree.ShowBorder = false;
31: innerTree.ShowHeader = false;
32: innerTree.EnableIcons = false;
33: innerTree.AutoScroll = true;
34: accordionPane.Items.Add(innerTree);
35:
36: XmlDocument innerXmlDoc = new XmlDocument();
37: innerXmlDoc.LoadXml(String.Format("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Tree>{0}</Tree>", xmlNode.InnerXml));
38:
39: // 綁定AccordionPane內部的樹控件
40: innerTree.DataSource = innerXmlDoc;
41: innerTree.DataBind();
42: }
43: }
44: }
來分析一下這段代碼的邏輯:
- 首先創建一個手風琴控件,並添加到父容器中(Region2.Items.Add);
- 從Xml數據源獲取XmlDocument對象;
- 選取XmlDocument對象中第一層TreeNode節點集合(其XPath路徑為/Tree/TreeNode);
- 遍歷第一層TreeNode節點集合,並生成手風琴控件的子面板(new AccordionPane),注意這些子面板的Layout屬性為Fit;
- 向手風琴子面板中加入新創建的樹控件(accordionPane.Items.Add);
- 讀取當前Xml節點的內部標簽(xmlNode.InnerXml),並創建新的XmlDocument對象並綁定到樹控件上。
通過上面的幾個步驟,我們創建了一個手風琴控件,每個手風琴控件子面板中創建了一個樹控件,從而完成這個任務。
小結
本章我們講解了手風琴控件的基本用法,以及如何結合手風琴和樹控件來創建站點菜單。下一篇文章我們會介紹和手風琴控件比較類似的選項卡控件。