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

初次来到博客园,实在不知道拿些什么出来奉献给大家才好,想来想去,用我最近做的一个小案例为开头吧!

这个案例是一个基于VS2005的WinForm菜单控件的例子,功能是从XML中动态加载菜单数据到MenuTrip控件上。这个案例中用到了XML,反射之类的技术。当然实用价值有限,仅供学习参考之用。

首先创建一个WinForm项目,在Form1上放置一个MenuTrip控件,将其命名为MainMenu。

 在项目中添加一个XML文件,命名为Menu.xml,代码如下:

ContractedBlock.gif ExpandedBlockStart.gif MenuXml
 1xml 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>
22Menus>
23

 接着往项目中再添加一个Menu.cs类,用来完成菜单的读取等相关操作,代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 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
 10ExpandedBlockStart.gifContractedBlock.gif{
 11ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// 
 12    /// 菜单读取类
 13    /// 

 14    public class Menu
 15ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 16        private string _Path;
 17
 18ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// 
 19        /// 设置XML配置文件路径
 20        /// 

 21        public string Path
 22ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 23ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _Path; }
 24ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _Path = value; }
 25        }
 
 26
 27ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// 
 28        /// 判断文件是否存在
 29        /// 

 30        /// 文件是否存在

 31        public bool FileExit()
 32ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 33            if (File.Exists(_Path))
 34ExpandedSubBlockStart.gifContractedSubBlock.gif            return true; }
 35            else return false;
 36        }

 37      
 38ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// 
 39        /// 加载菜单
 40        /// 

 41        /// 母菜单对象

 42        public void LoadAllMenu(MenuStrip menuStrip)
 43ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 44            //读取XML配置文件
 45            XmlTextReader xmlReader = new XmlTextReader(_Path);
 46            while (xmlReader.Read())
 47ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 48                //判断是否循环到MainMenu节点
 49                if (!xmlReader.IsEmptyElement && xmlReader.Name == "MainMenu")
 50ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 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)
 60ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
 61                        //动态添加一项菜单
 62                        menuStrip.Items.Add(toolItem);
 63                    }

 64                }

 65                //判断是否到子菜单节点
 66                else if (!xmlReader.IsEmptyElement && xmlReader.Name == "SubMenu")
 67ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 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())
 76ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
 77                        if (!xmlSubReader.IsEmptyElement && xmlSubReader.Name == "Title")
 78ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
 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(02)];
 86                        //添加子菜单
 87                        toolStripMenuItem.DropDownItems.Add(toolSubItem);
 88                    }

 89                }

 90            }

 91        }

 92
 93        void toolSubItem_Click(object sender, EventArgs e)
 94ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 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,该方法定义了每个菜单项在加载后单击事件所调用的方法。代码如下:

ContractedBlock.gif ExpandedBlockStart.gif MenuMethod
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.Windows.Forms;
 5
 6namespace WindowsApplication1
 7ExpandedBlockStart.gifContractedBlock.gif{
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// 
 9    /// 菜单的方法列表类
10    /// 

11    class MenuMethod
12ExpandedSubBlockStart.gifContractedSubBlock.gif    {
13        public void Item101()
14ExpandedSubBlockStart.gifContractedSubBlock.gif        {
15            MessageBox.Show("方法1");
16        }

17
18        public void Item102()
19ExpandedSubBlockStart.gifContractedSubBlock.gif        {
20            MessageBox.Show("方法2");
21        }

22
23        public void Item111()
24ExpandedSubBlockStart.gifContractedSubBlock.gif        {
25            MessageBox.Show("方法3");
26        }

27
28        public void Item112()
29ExpandedSubBlockStart.gifContractedSubBlock.gif        {
30            MessageBox.Show("方法4");
31        }

32
33        public void Item113()
34ExpandedSubBlockStart.gifContractedSubBlock.gif        {
35            MessageBox.Show("方法5");
36        }

37    }

38}

39

 最后在Form1.cs的Load方法中填写如下代码:

ContractedBlock.gif ExpandedBlockStart.gif MainCode
 1private void Form1_Load(object sender, EventArgs e)
 2ExpandedBlockStart.gifContractedBlock.gif{
 3    Menu menu = new Menu();
 4    menu.Path = "http://www.cnblogs.com/Menu.xml";
 5    if (menu.FileExit())
 6ExpandedSubBlockStart.gifContractedSubBlock.gif    { menu.LoadAllMenu(MainMenu); }
 7    else
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    { MessageBox.Show("XML文件加载失败!"); }
 9}

10

 程序运行后界面如下:

从XML中动态加载菜单的示例_第1张图片

程序代码包文件下载:示例程序代码包

转载于:https://www.cnblogs.com/jinqi79731/archive/2008/12/02/1346246.html

你可能感兴趣的:(从XML中动态加载菜单的示例)