本文配套源碼
這個案例是一個基於VS2005的WinForm菜單控件的例子,功能是從XML中動態加載菜單數據到MenuTrip控件上。這個案例中用到了XML,反射之類的技術。當然實用價值有限,僅供學習參考之用。
首先創建一個WinForm項目,在Form1上放置一個MenuTrip控件,將其命名為MainMenu。
在項目中添加一個XML文件,命名為Menu.xml,代碼如下:
MenuXml
1<?xml version="1.0" encoding="utf-8" ?>
2<Menus>
3 <MainMenu id="10" title="文件">
4 <SubMenu id="101">
5 <Title>打開文件</Title>
6 </SubMenu>
7 <SubMenu id="102">
8 <Title>關閉文件</Title>
9 </SubMenu>
10 </MainMenu>
11 <MainMenu id="11" title="編輯">
12 <SubMenu id="111">
13 <Title>剪切</Title>
14 </SubMenu>
15 <SubMenu id="112">
16 <Title>復制</Title>
17 </SubMenu>
18 <SubMenu id="113">
19 <Title>粘貼</Title>
20 </SubMenu>
21 </MainMenu>
22</Menus>
23
接著往項目中再添加一個Menu.cs類,用來完成菜單的讀取等相關操作,代碼如下:
XMLCode
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Windows.Forms;
5using System.Xml;
6using System.IO;
7using System.Reflection;
8
9namespace WindowsApplication1
10{
11 /**//// <summary>
12 /// 菜單讀取類
13 /// </summary>
14 public class Menu
15 {
16 private string _Path;
17
18 /**//// <summary>
19 /// 設置XML配置文件路徑
20 /// </summary>
21 public string Path
22 {
23 get { return _Path; }
24 set { _Path = value; }
25 }
26
27 /**//// <summary>
28 /// 判斷文件是否存在
29 /// </summary>
30 /// <returns>文件是否存在</returns>
31 public bool FileExit()
32 {
33 if (File.Exists(_Path))
34 { return true; }
35 else return false;
36 }
37
38 /**//// <summary>
39 /// 加載菜單
40 /// </summary>
41 /// <param name="menuStrip">母菜單對象</param>
42 public void LoadAllMenu(MenuStrip menuStrip)
43 {
44 //讀取XML配置文件
45 XmlTextReader xmlReader = new XmlTextReader(_Path);
46 while (xmlReader.Read())
47 {
48 //判斷是否循環到MainMenu節點
49 if (!xmlReader.IsEmptyElement && xmlReader.Name == "MainMenu")
50 {
51 //創建一級菜單項
52 ToolStripMenuItem toolItem = new ToolStripMenuItem();
53 //獲取屬性ID值
54 string id = xmlReader.GetAttribute("id");
55 toolItem.Name = "Item" + id;
56 //獲取屬性TITLE值
57 string title = xmlReader.GetAttribute("title");
58 toolItem.Text = title;
59 if (title != null && title.Length > 1)
60 {
61 //動態添加一項菜單
62 menuStrip.Items.Add(toolItem);
63 }
64 }
65 //判斷是否到子菜單節點
66 else if (!xmlReader.IsEmptyElement && xmlReader.Name == "SubMenu")
67 {
68 //創建子菜單對象
69 ToolStripMenuItem toolSubItem = new ToolStripMenuItem();
70 string id = xmlReader.GetAttribute("id");
71 toolSubItem.Name = "Item" + id;
72 //獲取子菜單樹
73 XmlReader xmlSubReader = xmlReader.ReadSubtree();
74 MenuMethod menuMethod = new MenuMethod();
75 while (xmlSubReader.Read())
76 {
77 if (!xmlSubReader.IsEmptyElement && xmlSubReader.Name == "Title")
78 {
79 //添加子菜單的文字
80 toolSubItem.Text = xmlSubReader.ReadElementString();
81 //為菜單添加單擊事件
82 toolSubItem.Click += new EventHandler(toolSubItem_Click);
83 }
84 //獲取母菜單對象
85 ToolStripMenuItem toolStripMenuItem = (ToolStripMenuItem)menuStrip.Items["Item" + id.Substring(0, 2)];
86 //添加子菜單
87 toolStripMenuItem.DropDownItems.Add(toolSubItem);
88 }
89 }
90 }
91 }
92
93 void toolSubItem_Click(object sender, EventArgs e)
94 {
95 //創建菜單調用方法類的實例
96 MenuMethod menuMethod=new MenuMethod();
97 Type type = menuMethod.GetType();
98 //動態獲取方法對象
99 MethodInfo mi = type.GetMethod(((ToolStripMenuItem)sender).Name);
100 //調用指定方法
101 mi.Invoke(menuMethod, null);
102
103 }
104 }
105}
106
另外再添加一個類,命名為MenuMethod.cs,該方法定義了每個菜單項在加載後單擊事件所調用的方法。代碼如下:
MenuMethod
1using System;
最後在Form1.cs的Load方法中填寫如下代碼:
2using System.Collections.Generic;
3using System.Text;
4using System.Windows.Forms;
5
6namespace WindowsApplication1
7{
8 /**//// <summary>
9 /// 菜單的方法列表類
10 /// </summary>
11 class MenuMethod
12 {
13 public void Item101()
14 {
15 MessageBox.Show("方法1");
16 }
17
18 public void Item102()
19 {
20 MessageBox.Show("方法2");
21 }
22
23 public void Item111()
24 {
25 MessageBox.Show("方法3");
26 }
27
28 public void Item112()
29 {
30 MessageBox.Show("方法4");
31 }
32
33 public void Item113()
34 {
35 MessageBox.Show("方法5");
36 }
37 }
38}
39
MainCode
1private void Form1_Load(object sender, EventArgs e)
2{
3 Menu menu = new Menu();
4 menu.Path = "http://www.cnblogs.com/Menu.xml";
5 if (menu.FileExit())
6 { menu.LoadAllMenu(MainMenu); }
7 else
8 { MessageBox.Show("XML文件加載失敗!"); }
9}
10
程序運行後界面如下: