从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

时间: 2024-09-02 20:21:27

从XML中动态加载菜单的示例的相关文章

Visual Basic .NET 中动态加载类(一)

visual|动态|加载 Visual Basic .NET 中动态加载类 · ··Microsoft 摘要:理想情况下,编写软件系统之前我们就应该知道此软件系统需要完成哪些操作.但实际情况并非如此,因此我们的系统应该是可以调整的. 最能体现这种适应性的是动态集成新功能的能力.例如,在 Windows 窗体应用程序中,这种能力是指加载编译原始应用绦蚝芫靡院蟠唇ǖ拇疤宓哪芰Α?/P> 这种操作在 Microsoft Visual Basic 6.0 中几乎是不可能的,但是在 Visual Basi

Visual Basic .NET 中动态加载类 (三)

visual|动态|加载 ··Microsoft 步骤 8:用新的窗体信息更新配置文件 现在,我们已经创建了一些新窗体,还需要在配置文件中引用它们.请用以下代码行替换 FormsOnTheFly.exe.config 中的占位符信息: <add key="First Form" value="C:\NewForms\FirstForm.dll~FirstForm.Form1"></add><add key="Second Fo

flex4/flash builder中动态加载Module并与之交互的正确方式

关于flex中动态加载Module的文章,网上有很多,但多半是基于flex3的,如果在flash builder/flex4中按他们所提供的方法去做,最后将module加载到容器中时,会报:null object reference错误. 经过多番摸索,发现只能在ready回调中,以Object这种基本类型使用,不能强制做任何类型转型,方能正常加载到容器,并与加载后的实例交互(虽然这样flash builder的IDE环境中,无法智能代码提示),原因不明! 开始吧,先创建一个mxml Modul

在ASP.NET中动态加载内容(用户控件和模板)

asp.net|动态|加载|控件|模板 在ASP.NET中动态加载内容(用户控件和模板)要点:1. 使用Page.ParseControl2. 使用base.LoadControl第一部分:加载模板 下面是一个模板"<table width=100%><tr><td width=100% colspan=2 runat=server id=ContainerTop></td></tr><tr><td width=30%

flash as3 中动态加载库类失败解决方法

flash as3 中动态加载库类失败解决方法 这是错误的写法 for (var i:number=1; i<4; i++) { var mc1:mc1 = new mc1(); addchild(mc1); } as3里怎么循环加载库里的mc1 mc2 mc3类 就是下面意思是怎样个的写法 for (var i:number=1; i<4; i++) { var "mc"+i:"mc"+i = new "mc"+i(); addch

python中动态加载模块和类方法实现

python中动态加载模块和类方法实现测试代码   文件名: mytest.py 具体代码如下:   注意:模块名,类名,方法名都是变量.   #coding=UTF-8 class TestClass: def sub(self,a,b): return a-b def add(self,a,b): return a+b def echo(self): print "test" def main(): class_name = "TestClass" #类名 mo

angularjs directive-agularjs中在directive中动态加载template如何实现

问题描述 agularjs中在directive中动态加载template如何实现 由于 agularjs内的$http是异步的请求方式 而我的html代码有一部分存储在后台,遂使用watch来监听html变量的变化 ,但问题是拿到了最新的html字符串如何赋给directive中的template.

VC中动态加载ODBC解决方法

在使用 VC. VB. Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置 ODBC数据源.对于一般用户而言,配置 ODBC数据源可能是一件比较困难的工作.      而且,在实际应用中,用户往往要求在同一个应用程序中访问不同的数据源,因此采用一般的加载方法就有了无法克服的缺陷.为能在程序中完成这一工作,方便应用程序的使用,本文以 VC为开发环境介绍两种在应用程序中动态加载 ODBC系统数据源的方法. 方法一:修改注册表 设计思路 一般情况下,当用户在控制面板中配置好

osg-OSG中动态加载模型,并动态显示??

问题描述 OSG中动态加载模型,并动态显示?? 比如我想先显示一个奶牛模型,显示完之后我又要在牛模型不消失的情况下再加载一个飞机模型并显示,相当于显示了两个模型,怎么实现???? 解决方案 动态加载模型 解决方案二: http://www.cnblogs.com/mazhenyu/p/3522056.html