1. 预备一个xml文件
xmlmenu
1%26lt;Menu%26gt;
2 %26lt;MenuItem Name="系统治理" AssemblyName="" FormTag="FALSE" AddToolbar="FALSE"%26gt;
3 %26lt;MenuItem Name="权限治理" ShortCut="" Image="" AssemblyName="" FormTag="FALSE" AddToolButton="FALSE"%26gt;
4 %26lt;MenuItem Name="系统权限治理" ShortCut="" Image="password.png" AssemblyName="HustCAD.IntePLM.WinUI.FrmSysRight,IntePLM.TyRightWinUI" FormTag="TRUE" AddToolButton="FALSE"/%26gt;
5 %26lt;MenuItem Name="权限规则定义" ShortCut="" Image="right.png" AssemblyName="HustCAD.IntePLM.WinUI.FrmRightRule,IntePLM.TyRightWinUI" FormTag="TRUE" AddToolButton="FALSE"/%26gt;
6 %26lt;MenuItem Name="权限日志" ShortCut="" Image="doc_yellow_edit.png" AssemblyName="HustCAD.IntePLM.WinUI.FrmRightLog,IntePLM.TyRightWinUI" FormTag="TRUE" AddToolButton="FALSE"/%26gt;
7 %26lt;/MenuItem%26gt;
8%26lt;/Menu%26gt;
2.预备一个xml schemal文件来验证xml文件
%26lt;?xml version="1.0" encoding="UTF-8"?%26gt;
%26lt;!-- edited with XMLSpy v2006 sp2 U (http://www.altova.com) by peter (hust) --%26gt;
%26lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"%26gt;
%26lt;xs:element name="Menu"%26gt;
%26lt;xs:complexType%26gt;
%26lt;xs:sequence%26gt;
%26lt;xs:element ref="MenuItem" maxOccurs="unbounded"/%26gt;
%26lt;/xs:sequence%26gt;
%26lt;/xs:complexType%26gt;
%26lt;/xs:element%26gt;
%26lt;xs:element name="MenuItem"%26gt;
%26lt;xs:complexType%26gt;
%26lt;xs:sequence%26gt;
%26lt;xs:element ref="MenuItem" minOccurs="0" maxOccurs="unbounded"/%26gt;
%26lt;/xs:sequence%26gt;
%26lt;xs:attribute name="AddToolButton"%26gt;
%26lt;xs:simpleType%26gt;
%26lt;xs:restriction base="xs:string"%26gt;
%26lt;xs:enumeration value="TRUE"/%26gt;
%26lt;xs:enumeration value="FALSE"/%26gt;
%26lt;/xs:restriction%26gt;
%26lt;/xs:simpleType%26gt;
%26lt;/xs:attribute%26gt;
%26lt;xs:attribute name="AddToolbar"%26gt;
%26lt;xs:simpleType%26gt;
%26lt;xs:restriction base="xs:string"%26gt;
%26lt;xs:enumeration value="TRUE"/%26gt;
%26lt;xs:enumeration value="FALSE"/%26gt;
%26lt;/xs:restriction%26gt;
%26lt;/xs:simpleType%26gt;
%26lt;/xs:attribute%26gt;
%26lt;xs:attribute name="AssemblyName" type="xs:string" use="required"/%26gt;
%26lt;xs:attribute name="FormTag" use="required"%26gt;
%26lt;xs:simpleType%26gt;
%26lt;xs:restriction base="xs:string"%26gt;
%26lt;xs:enumeration value="TRUE"/%26gt;
%26lt;xs:enumeration value="FALSE"/%26gt;
%26lt;/xs:restriction%26gt;
%26lt;/xs:simpleType%26gt;
%26lt;/xs:attribute%26gt;
%26lt;xs:attribute name="Image" type="xs:string"/%26gt;
%26lt;xs:attribute name="Name" type="xs:string" use="required"/%26gt;
%26lt;xs:attribute name="ShortCut" use="optional"%26gt;
%26lt;xs:simpleType%26gt;
%26lt;xs:restriction base="xs:string"%26gt;
%26lt;xs:enumeration value="F1"/%26gt;
%26lt;xs:enumeration value="F2"/%26gt;
%26lt;xs:enumeration value="F3"/%26gt;
%26lt;xs:enumeration value="F4"/%26gt;
%26lt;xs:enumeration value="F5"/%26gt;
%26lt;xs:enumeration value="F6"/%26gt;
%26lt;xs:enumeration value="F7"/%26gt;
%26lt;xs:enumeration value="F8"/%26gt;
%26lt;xs:enumeration value="F9"/%26gt;
%26lt;xs:enumeration value="F10"/%26gt;
%26lt;xs:enumeration value="F11"/%26gt;
%26lt;xs:enumeration value="F12"/%26gt;
%26lt;xs:enumeration value="Alt0"/%26gt;
%26lt;xs:enumeration value="Alt1"/%26gt;
%26lt;xs:enumeration value="Alt2"/%26gt;
%26lt;xs:enumeration value="Alt3"/%26gt;
%26lt;xs:enumeration value="Alt4"/%26gt;
%26lt;xs:enumeration value="Alt5"/%26gt;
%26lt;xs:enumeration value="Alt6"/%26gt;
%26lt;xs:enumeration value="Alt7"/%26gt;
%26lt;xs:enumeration value="Alt8"/%26gt;
%26lt;xs:enumeration value="Alt9"/%26gt;
%26lt;xs:enumeration value="AltBksp"/%26gt;
%26lt;xs:enumeration value="AltF1"/%26gt;
%26lt;xs:enumeration value="AltF2"/%26gt;
%26lt;xs:enumeration value="AltF3"/%26gt;
%26lt;xs:enumeration value="AltF4"/%26gt;
%26lt;xs:enumeration value="AltF5"/%26gt;
%26lt;xs:enumeration value="AltF6"/%26gt;
%26lt;xs:enumeration value="AltF7"/%26gt;
%26lt;xs:enumeration value="AltF8"/%26gt;
%26lt;xs:enumeration value="AltF9"/%26gt;
%26lt;xs:enumeration value="AltF10"/%26gt;
%26lt;xs:enumeration value="AltF11"/%26gt;
%26lt;xs:enumeration value="AltF12"/%26gt;
%26lt;xs:enumeration value="AltDownArrow"/%26gt;
%26lt;xs:enumeration value="AltUpArrow"/%26gt;
%26lt;xs:enumeration value="AltLeftArrow"/%26gt;
%26lt;xs:enumeration value="AltRightArrow"/%26gt;
%26lt;xs:enumeration value="Ctrl0"/%26gt;
%26lt;xs:enumeration value="Ctrl1"/%26gt;
%26lt;xs:enumeration value="Ctrl2"/%26gt;
%26lt;xs:enumeration value="Ctrl3"/%26gt;
%26lt;xs:enumeration value="Ctrl4"/%26gt;
%26lt;xs:enumeration value="Ctrl5"/%26gt;
%26lt;xs:enumeration value="Ctrl6"/%26gt;
%26lt;xs:enumeration value="Ctrl7"/%26gt;
%26lt;xs:enumeration value="Ctrl8"/%26gt;
%26lt;xs:enumeration value="Ctrl9"/%26gt;
%26lt;xs:enumeration value="CtrlA"/%26gt;
%26lt;xs:enumeration value="CtrlB"/%26gt;
%26lt;xs:enumeration value="CtrlC"/%26gt;
%26lt;xs:enumeration value="CtrlD"/%26gt;
%26lt;xs:enumeration value="CtrlE"/%26gt;
%26lt;xs:enumeration value="CtrlF"/%26gt;
%26lt;xs:enumeration value="CtrlG"/%26gt;
%26lt;xs:enumeration value="CtrlH"/%26gt;
%26lt;xs:enumeration value="CtrlI"/%26gt;
%26lt;xs:enumeration value="CtrlJ"/%26gt;
%26lt;xs:enumeration value="CtrlK"/%26gt;
%26lt;xs:enumeration value="CtrlL"/%26gt;
%26lt;xs:enumeration value="CtrlM"/%26gt;
%26lt;xs:enumeration value="CtrlN"/%26gt;
%26lt;xs:enumeration value="CtrlO"/%26gt;
%26lt;xs:enumeration value="CtrlP"/%26gt;
%26lt;xs:enumeration value="CtrlQ"/%26gt;
%26lt;xs:enumeration value="CtrlR"/%26gt;
%26lt;xs:enumeration value="CtrlS"/%26gt;
%26lt;xs:enumeration value="CtrlT"/%26gt;
%26lt;xs:enumeration value="CtrlU"/%26gt;
%26lt;xs:enumeration value="CtrlV"/%26gt;
%26lt;xs:enumeration value="CtrlX"/%26gt;
%26lt;xs:enumeration value="CtrlY"/%26gt;
%26lt;xs:enumeration value="CtrlZ"/%26gt;
%26lt;xs:enumeration value="CtrlF1"/%26gt;
%26lt;xs:enumeration value="CtrlF2"/%26gt;
%26lt;xs:enumeration value="CtrlF3"/%26gt;
%26lt;xs:enumeration value="CtrlF4"/%26gt;
%26lt;xs:enumeration value="CtrlF5"/%26gt;
%26lt;xs:enumeration value="CtrlF6"/%26gt;
%26lt;xs:enumeration value="CtrlF7"/%26gt;
%26lt;xs:enumeration value="CtrlF8"/%26gt;
%26lt;xs:enumeration value="CtrlF9"/%26gt;
%26lt;xs:enumeration value="CtrlF10"/%26gt;
%26lt;xs:enumeration value="CtrlF11"/%26gt;
%26lt;xs:enumeration value="CtrlF12"/%26gt;
%26lt;xs:enumeration value="CtrlIns"/%26gt;
%26lt;xs:enumeration value="CtrlShift0"/%26gt;
%26lt;xs:enumeration value="CtrlShift1"/%26gt;
%26lt;xs:enumeration value="CtrlShift2"/%26gt;
%26lt;xs:enumeration value="CtrlShift3"/%26gt;
%26lt;xs:enumeration value="CtrlShift4"/%26gt;
%26lt;xs:enumeration value="CtrlShift5"/%26gt;
%26lt;xs:enumeration value="CtrlShift6"/%26gt;
%26lt;xs:enumeration value="CtrlShift7"/%26gt;
%26lt;xs:enumeration value="CtrlShift8"/%26gt;
%26lt;xs:enumeration value="CtrlShift9"/%26gt;
%26lt;xs:enumeration value="CtrlShiftA"/%26gt;
%26lt;xs:enumeration value="CtrlShiftB"/%26gt;
%26lt;xs:enumeration value="CtrlShiftC"/%26gt;
%26lt;xs:enumeration value="CtrlShiftD"/%26gt;
%26lt;xs:enumeration value="CtrlShiftE"/%26gt;
%26lt;xs:enumeration value="CtrlShiftF"/%26gt;
%26lt;xs:enumeration value="CtrlShiftG"/%26gt;
%26lt;xs:enumeration value="CtrlShiftH"/%26gt;
%26lt;xs:enumeration value="CtrlShiftI"/%26gt;
%26lt;xs:enumeration value="CtrlShiftJ"/%26gt;
%26lt;xs:enumeration value="CtrlShiftK"/%26gt;
%26lt;xs:enumeration value="CtrlShiftL"/%26gt;
%26lt;xs:enumeration value="CtrlShiftM"/%26gt;
%26lt;xs:enumeration value="CtrlShiftN"/%26gt;
%26lt;xs:enumeration value="CtrlShiftO"/%26gt;
%26lt;xs:enumeration value="CtrlShiftP"/%26gt;
%26lt;xs:enumeration value="CtrlShiftQ"/%26gt;
%26lt;xs:enumeration value="CtrlShiftR"/%26gt;
%26lt;xs:enumeration value="CtrlShiftS"/%26gt;
%26lt;xs:enumeration value="CtrlShiftT"/%26gt;
%26lt;xs:enumeration value="CtrlShiftU"/%26gt;
%26lt;xs:enumeration value="CtrlShiftV"/%26gt;
%26lt;xs:enumeration value="CtrlShiftW"/%26gt;
%26lt;xs:enumeration value="CtrlShiftX"/%26gt;
%26lt;xs:enumeration value="CtrlShiftY"/%26gt;
%26lt;xs:enumeration value="CtrlShiftZ"/%26gt;
%26lt;xs:enumeration value="ShiftIns"/%26gt;
%26lt;xs:enumeration value="ShiftF1"/%26gt;
%26lt;xs:enumeration value="ShiftF2"/%26gt;
%26lt;xs:enumeration value="ShiftF3"/%26gt;
%26lt;xs:enumeration value="ShiftF4"/%26gt;
%26lt;xs:enumeration value="ShiftF5"/%26gt;
%26lt;xs:enumeration value="ShiftF6"/%26gt;
%26lt;xs:enumeration value="ShiftF7"/%26gt;
%26lt;xs:enumeration value="ShiftF8"/%26gt;
%26lt;xs:enumeration value="ShiftF9"/%26gt;
%26lt;xs:enumeration value="ShiftF10"/%26gt;
%26lt;xs:enumeration value="ShiftF11"/%26gt;
%26lt;xs:enumeration value="ShiftF12"/%26gt;
%26lt;xs:enumeration value=""/%26gt;
%26lt;/xs:restriction%26gt;
%26lt;/xs:simpleType%26gt;
%26lt;/xs:attribute%26gt;
%26lt;/xs:complexType%26gt;
%26lt;/xs:element%26gt;
%26lt;/xs:schema%26gt;
3。定义一个类来加载菜单
public class MenuLoad
{
private PluginCollection m_plugins = null;
public MenuBar _menbar = new MenuBar();
public ToolStrip _toolbar = new ToolStrip();
private OutlookBar bar = new OutlookBar();
private ImageList imglist = new ImageList();
private StringBuilder builder = new StringBuilder();
public MenuLoad()
{
bar = _menbar.outlookBar;
}
private TabControl tabCtrl;
public TabControl TabCtrl
{
set
{
tabCtrl = value;
}
}
private void ValidationEventHandler(object sender, ValidationEventArgs e)
{
builder.AppendLine("验证XML文档的时候发生错误");
builder.AppendLine("严重级别" + e.Severity);
builder.AppendLine("错误信息" + e.Message);
builder.AppendLine("------+--------+-------+------+--------+-------+------+--------+-------+");
builder.AppendLine();
}
/**//// %26lt;summary%26gt;
/// 验证XML文件是否是合乎规范的文件
/// %26lt;/summary%26gt;
/// %26lt;param name="xmlfile"%26gt;文件名称%26lt;/param%26gt;
/// %26lt;returns%26gt;是则返回true,否则返回false%26lt;/returns%26gt;
private bool ValidateXml(string xmlfile)
{
bool validXml = false;
string spath = "";
spath = Application.StartupPath + "\\configurations\\XMLSMenu.xsd";
if(!System.IO.File.Exists(spath))
{
throw new System.IO.FileNotFoundException(String.Format(Resources.StringFileNotFound, spath));
}
XmlReaderSettings settings = new XmlReaderSettings();
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, spath);
settings.Schemas.Add(schemaSet);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler);
settings.ValidationFlags = settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;
XmlReader reader = XmlReader.Create(xmlfile, settings);
while(reader.Read())
{
}
if(builder.Length %26gt; 0)
{
validXml = false;
}
else
{
validXml = true;
}
reader.Close();
return validXml;
}
/**//// %26lt;summary%26gt;
/// 加载菜单
/// %26lt;/summary%26gt;
/// %26lt;param name="main"%26gt;主菜单%26lt;/param%26gt;
/// %26lt;param name="xmlfile"%26gt;菜单定义文件%26lt;/param%26gt;
public MainMenu LoadMenus(string xmlfile)
{
MainMenu mainmenu = new MainMenu();
try
{
using(new WaitCursor())
{
//验证XML是否是合乎规范的XML文件
if(ValidateXml(xmlfile))
{
XmlDocument document = new XmlDocument();
document.Load(xmlfile);
XmlNode rootNode = document.DocumentElement;
mainmenu = GetMenus(rootNode);
}
else
{
throw new Exception(builder.ToString());
}
}
}
catch (System.IO.FileNotFoundException)
{
Utility.ShowErrorMsg(String.Format(Resources.StringFileNotFound, xmlfile));
}
return mainmenu;
}
/**//// %26lt;summary%26gt;
/// 加载菜单
/// %26lt;/summary%26gt;
/// %26lt;param name="main"%26gt;主菜单%26lt;/param%26gt;
/// %26lt;param name="node"%26gt;菜单项节点%26lt;/param%26gt;
private MainMenu GetMenus(XmlNode node)
{
MainMenu mainmenu = new MainMenu();
List%26lt;XmlNode%26gt; nodelist= new List%26lt;XmlNode%26gt;();
List%26lt;OfficeMenuItem%26gt; mnulist = new List%26lt;OfficeMenuItem%26gt;();
List%26lt;IconPanel%26gt; iplist = new List%26lt;IconPanel%26gt;();
string menutext ="";
//首先加载主菜单,避免迭代的时候菜单显示的过分延迟。
foreach(XmlNode child in node.ChildNodes)
{
if(child.NodeType == XmlNodeType.Element %26amp;%26amp; child.Name == "MenuItem")
{
menutext = child.Attributes["Name"].Value;
OfficeMenuItem item = new OfficeMenuItem(true,menutext);
mainmenu.MenuItems.Add(item);
IconPanel cp = new IconPanel();
bar.AddBand(menutext, cp);
nodelist.Add(child);
mnulist.Add(item);
iplist.Add(cp);
}
}
//加载所有的子菜单
GetSubMenus(iplist.ToArray(),mnulist.ToArray(), nodelist.ToArray());
return mainmenu;
}
/**//// %26lt;summary%26gt;
/// 加载所有子菜单
/// %26lt;/summary%26gt;
/// %26lt;param name="main"%26gt;主菜单集合%26lt;/param%26gt;
/// %26lt;param name="node"%26gt;菜单节点集合%26lt;/param%26gt;
private void GetSubMenus(IconPanel[] iplist ,OfficeMenuItem[] main, XmlNode[] node)
{
EventHandler handler = new EventHandler(OnPluginClick);
EventHandler handler1 = new EventHandler(OnIconClick);
EventHandler handler2 = new EventHandler(OnButtonClick);
string asmname;
string formtag;
string text;
MenuClass mc;
XmlNode child;
string iconpath = "";
string iconname = "";
string msc = "";
for(int i = 0; i %26lt;= main.GetUpperBound(0); i++)
{
//foreach(XmlNode child in node[i].ChildNodes)
for(int j = 0; j %26lt; node[i].ChildNodes.Count;j++ )
{
child = node[i].ChildNodes[j];
if(child.NodeType == XmlNodeType.Element %26amp;%26amp; child.Name == "MenuItem")
{
asmname = child.Attributes["AssemblyName"].Value;
formtag = child.Attributes["FormTag"].Value;
text = child.Attributes["Name"].Value;
msc = child.Attributes["ShortCut"].Value;
OfficeMenuItem item = new OfficeMenuItem(true, text, handler);
iconname = child.Attributes["Image"].Value;
if(iconname != string.Empty)
{
iconpath = Themes.GetCurrentThemePath() +iconname;
item.IconPath = iconpath;
}
mc = new MenuClass();
mc.Assemblyname = asmname;
mc.FormTag = formtag;
item.Tag = mc;
if(msc != string.Empty)
{
item.Shortcut = MenuShortCut.GetShortCut(msc);
}
main[i].MenuItems.Add(item);
if((iconpath != string.Empty) %26amp;%26amp; System.IO.File.Exists(iconpath))
{ //添加按钮到OutlookBar
PanelIcon picon = iplist[i].AddIcon(item.Text,Image.FromFile(iconpath),handler1);
picon.Tag = mc;
//添加按钮到toolbar
ToolStripButton button = new ToolStripButton(item.Text, Image.FromFile(iconpath), handler2);
button.DisplayStyle = ToolStripItemDisplayStyle.Image;
button.ToolTipText = item.Text;
button.Tag = mc;
button.Visible = true;
_toolbar.Items.Add(button);
}
iconpath = "";
mc = null;
if(child.ChildNodes.Count %26gt; 0)
{
GetChildMenu(iplist[i],item, child);
}
}
}
//添加分割线
ToolStripSeparator ss = new ToolStripSeparator();
_toolbar.Items.Add(ss);
}
}
/**//// %26lt;summary%26gt;
/// 加载子菜单
/// %26lt;/summary%26gt;
/// %26lt;param name="parent"%26gt;父菜单%26lt;/param%26gt;
/// %26lt;param name="node"%26gt;父菜单定义XML节点%26lt;/param%26gt;
private void GetChildMenu(IconPanel ip,OfficeMenuItem parent, XmlNode node)
{
EventHandler handler = new EventHandler(OnPluginClick);
EventHandler handler1 = new EventHandler(OnIconClick);
EventHandler handler2 = new EventHandler(OnButtonClick);
MenuClass mc;
string asmname;
string formtag;
string text;
XmlNode child1;
string iconpath = "";
string iconname = "";
string msc = "";
//foreach(XmlNode child1 in node.ChildNodes)
for(int i = 0; i %26lt; node.ChildNodes.Count - 1;i++ )
{
child1 = node.ChildNodes[i];
//检查是否提供了类型
asmname = child1.Attributes["AssemblyName"].Value;
formtag = child1.Attributes["FormTag"].Value;
text = child1.Attributes["Name"].Value;
OfficeMenuItem childitem;
childitem = new OfficeMenuItem(true, text, handler);
childitem.Name = text;
mc = new MenuClass();
mc.Assemblyname = asmname;
mc.FormTag = formtag;
childitem.Tag = mc;
//添加快捷键
msc = child1.Attributes["ShortCut"].Value;
if(msc != string.Empty)
{
childitem.Shortcut = MenuShortCut.GetShortCut(msc);
}
//添加图标
iconname = child1.Attributes["Image"].Value;
if(iconname != string.Empty)
{
iconpath = Themes.GetCurrentThemePath() + iconname;
childitem.IconPath = iconpath;
}
parent.MenuItems.Add(childitem);
if((iconpath != string.Empty) %26amp;%26amp; System.IO.File.Exists(iconpath))
{ //添加按钮到OutlookBar
PanelIcon picon = ip.AddIcon(childitem.Text, Image.FromFile(iconpath), handler1);
picon.Tag = mc;
//添加按钮到toolbar
ToolStripButton button = new ToolStripButton(childitem.Text, Image.FromFile(iconpath), handler2);
button.DisplayStyle = ToolStripItemDisplayStyle.Image;
button.ToolTipText = childitem.Text;
button.Tag = mc;
button.Visible = true;
_toolbar.Items.Add(button);
}
iconpath = "";
mc = null;
if(child1.ChildNodes.Count %26gt; 0)
{
GetChildMenu(ip,childitem, child1);
}
}
}
/**//// %26lt;summary%26gt;
/// 打开一个窗体
/// %26lt;/summary%26gt;
/// %26lt;param name="asmname"%26gt;窗体类程序集和窗体类的组合,从节点的AssemblyName属性获取%26lt;/param%26gt;
private void OpenForm(MenuClass mc)
{
string asmname = mc.Assemblyname;
string formtag = mc.FormTag;
if (formtag == "")
{
throw new Exception(Resources.StringNoFormFlag);
}
if(formtag.ToUpper() == "TRUE")
{
if(asmname == string.Empty)
{
throw new NullReferenceException(Resources.StringAssemblyNull);
}
//string[] a = asmname.Split(',');
object obj = null;
Type tp = Type.GetType(asmname);
if(tp != null)
{
obj = Activator.CreateInstance(tp);
}
else
{
throw new Exception("加载程序的时候出错,请检查程序(dll,exe)是否存在或者类型是否正确。");
}
//检查是否是Form类
if((obj == null) | !(obj is Form))
{
throw new Exception(Resources.StringNotForm);
}
Form frm = (obj as Form);
//检查打开的第一个窗口是否是MDIFORM
if(Application.OpenForms[0].IsMdiContainer)
{
//作为MDICHILDFORM
frm.MdiParent = Application.OpenForms[0];
}
//加载窗体
frm.Show();
}
}
/**//// %26lt;summary%26gt;
/// 菜单单击事件
/// %26lt;/summary%26gt;
/// %26lt;param name="sender"%26gt;%26lt;/param%26gt;
/// %26lt;param name="args"%26gt;%26lt;/param%26gt;
private void OnPluginClick(object sender, EventArgs args)
{
OfficeMenuItem item = (OfficeMenuItem)sender;
MenuClass mc = (MenuClass) item.Tag;
if ((item.Text == "退出") | (item.Text == "EXIT"))
{
OnExitClick(sender, args);
return;
}
OpenForm(mc);
}
}
这里面用到了delegate,最重要的函数是加载菜单的函数和OnPluginClick函数。
使用这个框架可以动态增加任意的层次的模块。
微软的CAB 使用Resigster site方式来增加模块,感觉不是很方便。
假如您对这个框架感爱好可以邮件 piyanrong@gmail.com。
