这个案例是一个基于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;
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
最后在Form1.cs的Load方法中填写如下代码:
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