您的位置:首页 > 其它

WinForm 从XML中动态加载菜单的示例

2012-08-06 09:03 495 查看

WinForm 从XML中动态加载菜单的示例

这个案例是一个基于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: