从XML中动态加载菜单的示例
初次来到博客园,实在不知道哪些什么出来奉献给大家才好,想来想去,用我最近作的一个案例为开头吧!
这个案例是一个基于VS2005的WinForm的菜单控件的例子,功能是从XML中动态加载菜单数据到MenuTrip控件上。其中用到了XML,反射之类的技术。当然实用价值有限,仅供学习之用。
初次来到博客园,实在不知道拿些什么出来奉献给大家才好,想来想去,用我最近做的一个小案例为开头吧!
这个案例是一个基于VS2005的WinForm菜单控件的例子,功能是从XML中动态加载菜单数据到MenuTrip控件上。这个案例中用到了XML,反射之类的技术。当然实用价值有限,仅供学习参考之用。
首先创建一个WinForm项目,在Form1上放置一个MenuTrip控件,将其命名为MainMenu。
在项目中添加一个XML文件,命名为Menu.xml,代码如下:
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类,用来完成菜单的读取等相关操作,代码如下:
1
using System;2
using System.Collections.Generic;3
using System.Text;4
using System.Windows.Forms;5
using System.Xml;6
using System.IO;7
using System.Reflection;8

9
namespace WindowsApplication110


{11

/**//// <summary>12
/// 菜单读取类13
/// </summary>14
public class Menu15

{16
private string _Path;17

18

/**//// <summary>19
/// 设置XML配置文件路径20
/// </summary>21
public string Path22

{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,该方法定义了每个菜单项在加载后单击事件所调用的方法。代码如下:
1
using System;2
using System.Collections.Generic;3
using System.Text;4
using System.Windows.Forms;5

6
namespace WindowsApplication17


{8

/**//// <summary>9
/// 菜单的方法列表类10
/// </summary>11
class MenuMethod12

{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方法中填写如下代码:
1
private 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
else8

{ MessageBox.Show("XML文件加载失败!"); }9
}10

程序运行后界面如下:
程序代码包文件下载:示例程序代码包
浙公网安备 33010602011771号