//代码如下:
//--------------------------
using System;
using System.Collections;
using System.Windows.Forms;
using System.Xml;
using System.Drawing;
using System.ComponentModel;
using System.Data;
using System.Reflection;
namespace WinTmp
{
public class MenuCreat
{
string _sXmlFile;
string _sMenuName;
private Form _attachedForm;
System.Collections.Hashtable myHash = new System.Collections.Hashtable();
public MenuCreat(Form aForm)
{
//
// TODO: 在此处添加构造函数逻辑
//
_attachedForm = aForm;
//MessageBox.Show((aForm.GetType()).ToString());
}
public string MenuName
{
get
{
return _sMenuName;
}
set
{
_sMenuName = value;
}
}
public string XmlFile
{
get
{
return _sXmlFile;
}
set
{
_sXmlFile = value;
}
}
public MenuItem[] CreateMenuItems()
{
XmlDocument _oDoc = new XmlDocument( );
_oDoc.Load( _sXmlFile );
XmlNodeList _oMainMenu = _oDoc.DocumentElement.ChildNodes;
MenuItem[] _oMenuItems = new MenuItem[ _oMainMenu.Count ];
int i = 0;
foreach ( XmlElement element in _oMainMenu )
{
_oMenuItems[ i++ ] = ProcessMenuItem( element );
}
return _oMenuItems;
}
private MenuItem ProcessMenuItem(XmlElement inXmlElement)
{
string menuName = inXmlElement.Attributes["Name"].InnerXml;
if ( menuName.IndexOf("&") != -1 )
menuName = menuName.Replace("&", "&");
string menuChecked = inXmlElement.Attributes["Checked"].InnerXml;
string menuRadio = inXmlElement.Attributes["Radio"].InnerXml;
string menuEnabled = inXmlElement.Attributes["Enabled"].InnerXml;
string _onclick = inXmlElement.Attributes["OnClick"].InnerXml;
myHash.Add(menuName,_onclick);
//如何处理事件?请指教
MenuItemEX _oParentMenu = new MenuItemEX(menuName, new EventHandler( SelectMenuItem ) );
//MenuItem _oParentMenu = new MenuItem(menuName);
if ( menuChecked == "True" )
_oParentMenu.Checked = true;
if ( menuEnabled == "False" )
_oParentMenu.Enabled = false;
if ( menuRadio == "True" )
_oParentMenu.RadioCheck = true;
XmlNodeList _oNodes = inXmlElement.ChildNodes;
if ( _oNodes.Count > 0 )
{
MenuItem[] menuItems = new MenuItem[ _oNodes.Count ];
int i = 0 ;
foreach ( XmlElement node in _oNodes )
{
menuItems[i] = ProcessMenuItem( node);
if ( menuItems[i] != null)
_oParentMenu.MenuItems.Add(menuItems[i]);
i++;
}
}
return _oParentMenu;
}
public void SelectMenuItem(object sender, EventArgs e)
{
if (typeof(MenuItemEX).IsInstanceOfType(sender))
{
MenuItemEX item = (MenuItemEX)sender;
string myclick = myHash[item.Text].ToString();
Type myT = _attachedForm.GetType();
MethodInfo[] x = myT.GetMethods();
foreach (MethodInfo xtemp in x)
{
if (myclick.ToLower() == (xtemp.ToString().Trim().ToLower()))
{
xtemp.Invoke(this._attachedForm,null);
}
}
}
}
}
public class MenuItemEX : MenuItem
{
EventHandler clickHandler = null;
public EventHandler ClickHandler
{
set
{
clickHandler = value;
}
get
{
return clickHandler;
}
}
public MenuItemEX()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public MenuItemEX( string name, EventHandler handler ):base( name, handler )
{
Initialize( handler );
}
public MenuItemEX( string name):base( name)
{
//Initialize( handler );
}
private void Initialize( EventHandler handler )
{
clickHandler = handler;
}
}
public class Form1 : System.Windows.Forms.Form
{
public string myName = null;
public string MyName
{
get
{
return myName;
}
set
{
myName = value;
}
}
///
1<summary>
2/// 必需的设计器变量。
3/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
this.Menu = new MainMenu(CreateMenu());
}
///
1<summary>
2/// 清理所有正在使用的资源。
3/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
///
1<summary>
2/// 设计器支持所需的方法 - 不要使用代码编辑器修改
3/// 此方法的内容。
4/// </summary>
private void InitializeComponent()
{
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Name = "Form1";
this.Text = "Form1";
}
#endregion
private MenuItem[] CreateMenu()
{
string _sXmlFile;
_sXmlFile = Application.StartupPath + @"\Menu.xml";
MenuCreat menu = new MenuCreat(this);
menu.XmlFile = _sXmlFile;
MenuItem[] menuItems = menu.CreateMenuItems();
return menuItems;
}
///
1<summary>
2/// 应用程序的主入口点。
3/// </summary>
[STAThread]
public static void Main()
{
Form1 mainForm = new Form1();
//mainForm.Menu = new MainMenu(CreateMenu());
Application.Run(mainForm);
}
public void newclick()
{
MessageBox.Show("New Click");
}
public void openclick()
{
MessageBox.Show("Open Click");
}
public void closeclick()
{
MessageBox.Show("close Click");
}
}
}
//代码结束
---------------------------------------------------------------
XML文件如下:
1<mainmenu>
2<menu checked="False" enabled="True" formname="form2" name="&File" onclick="File_Click" openform="Form2" radio="False">
3<menu checked="False" enabled="False" formname="form2" name="&New" onclick="Void newclick()" openform="Form2" radio="False"></menu>
4<menu checked="False" enabled="True" formname="form2" name="&Open" onclick="Void openclick()" openform="Form2" radio="False"></menu>
5<menu checked="False" enabled="True" formname="form2" name="&Close" onclick="Void closeclick()" openform="Form2" radio="False"></menu>
6</menu>
7</mainmenu>
上面是一个根据XML文件来动态生成菜单的例子,你自己修改一下。