本文主要介绍基于XML的C#配置MenuStrip菜单的方法,涉及C#使用XML配置MenuStrip菜单的原理和实现技巧,有一定的参考价值,有需要的朋友可以参考一下。
本文介绍了基于XML的C#配置MenuStrip菜单的方法。分享给你,供你参考。如下所示:
1.本程序的描述
用XML来配置MenuStrip菜单,本程序只提供一个思路。在Load函数中,程序根据XML文件中的设置动态生成MenuStrip组件的Items集合。
程序示例如下:
2.使用的XML文档示例
?xml版本='1.0 '编码='gb2312 '?
!-menustrip:MNS主菜单控制中的每个菜单配置-
!- Menu:菜单栏中的项目,Text:显示名称,ShortKey:快捷键-
MenuStrip
菜单文本='文件'快捷键=' alt f '
Item Type='MenuItem' Text='修改窗口颜色'
item Type=' MenuItem ' Text==' red ' short key=' Shift F6 '
function attribute=' color tored '/
item Type=' MenuItem ' Text=' green ' short key=' Shift F7 '
function attribute=' ColorToLawnGreen '/
/项目
项目类型='分隔符'/
item Type=' MenuItem ' Text=' normal '快捷键='Ctrl Shift X '
function attribute=' form normal '/
item Type=' MenuItem ' Text==' minimize '快捷键='Ctrl Shift Y '
function attribute=' form minimize '/
item Type=' MenuItem ' Text==' maximize '快捷键='Ctrl Shift Z '
function attribute=' form maximize '/
项目类型='分隔符'/
item Type=' MenuItem ' Text==' close '快捷键='Alt F4 '
FunctionAttribute='FormClose' /
/菜单
Text=' help '快捷键=' alt f '
item Type=' MenuItem ' Text==' about ' function attribute=' form about '/
/菜单
/MenuStrip
配置规则:
所有内容都在标签MenuStrip中。
每个菜单标签代表一个水平菜单项,其中Text属性是显示的文本,ShortKey属性是选择的快捷键。
每个项目标签都在菜单或项目标签下,表示一个菜单项,菜单项中可以嵌套其他项目菜单项。
的类型属性。item标记表示此图像的类型,可分为两类:Seperator和MenuItem,前者对应ToolStripItem类,后者对应ToolStripSeparator类。
在。item选项卡,如果Type属性为MenuItem,还可以设置Text属性(显示文本)、ShortKey属性(快捷键)和FunctionAttribute属性(点击实例生成后要调用的函数绑定属性值)。
此外,单击该程序中生成的菜单会调用一个函数,该函数上方有一个RemarkAttribute。如果FunctionAttribute的值与其一致,将调用该函数。这个功能的设计没有死。它是这个程序中的一个函数。修改后还可以对应自定义控件、类等。
3.关于程序表单
该表单没有设置其他属性,只有一个名为mnsMainMenu的空MenuStrip。表单的名称是FormMain。
4.程序代码
使用系统;
使用系统。集合。泛型;
使用系统。组件模型;
使用系统。数据;
使用系统。绘图;
使用系统。Linq
使用系统。文本;
使用系统。线程。任务;
使用系统。Windows . Forms
使用系统。Xml
使用系统。反思;
命名空间程序22
{
公共分部类FormMain : Form
{
公共表单Main()
{
initialize component();
}
//1.将MenuConfig.xml中的信息反映到菜单mnsMainMenu中。
//2.直接添加显示文本、快捷键等信息,在标签中添加FunctionName属性。
//3.通过反射找到对应的函数,完成运算。
私有void Form1_Load(对象发送方,EventArgs e)
{
SetMainMenu(' menu config . XML ');
}
///摘要
///设置MenuStrip控件
////摘要
///param name='address'/param
私有void SetMainMenu(字符串地址)
{
//设置前清除MenuStrip中的所有项目
mnsMainMenu。items . Clear();
//读取XML文件
XML document XML doc=new XML document();
xmlDoc。负载(地址);
XmlNode root=xmlDoc。SelectSingleNode(' MenuStrip ');
SetMenu(mnsMainMenu,root);
}
///摘要
///设置MenuStrip控件第一层菜单及其子菜单
////摘要
///param name='ms'MenuStrip控件/param
///param name='xnode'XML结点/param
私有void SetMenu(MenuStrip ms,XmlNode xnode)
{
foreach(xnode中的XmlNode xn .子节点)
{
XML元素xe=(XML元素)xn;
toolstrip menuitem new tsmi=new toolstrip menuitem(xe .get属性(“Text”);
//设置快捷键
如果(字符串IsNullOrWhiteSpace(xe .GetAttribute('ShortKey '))
{
SetShortKey(newtsmi,xe .get属性(“快捷键”);
}
//设置调用函数
如果(!字符串IsNullOrWhiteSpace(xe .get属性('函数属性'))
{
纽茨米Tag=xe .get属性(“函数属性”);
纽茨米Click=ToolStripMenuItem _ Click
}
//设置子菜单
如果(xn .子节点数。=0)
{
SetItem(newtsmi,xn);
}
女士物品。添加(新tsmi);
}
}
///摘要
///设置工具条菜单项控件及其子菜单(递归设置)
////摘要
///param name=' tsmi ' toolstrip menuitem控件/param
///param name='xnode'XML结点/param
私有void SetItem(toolstrip menuitem tsmi,XmlNode xnode)
{
foreach(xnode中的XmlNode xn .子节点)
{
XML元素xe=(XML元素)xn;
toolstrip menuitem new tsmi=new toolstrip menuitem(xe .get属性(“Text”);
开关(xe .get属性(" Type "))
{
案例“菜单项”:
{
//设置快捷键
如果(!字符串IsNullOrWhiteSpace(xe .GetAttribute('ShortKey '))
{
SetShortKey(newtsmi,xe .get属性(“快捷键”);
}
//设置调用函数
如果(!字符串IsNullOrWhiteSpace(
xe .get属性('函数属性'))
{
纽茨米Tag=xe .get属性(“函数属性”);
纽茨米Click=ToolStripMenuItem _ Click
}
//设置子菜单
如果(xn .子节点数。=0)
{
SetItem(newtsmi,xn);
}
tsmi .下拉项目。Add(newtsmi作为toolstrip项);
}破;
案例"分隔符":
{
tsmi .下拉项目。添加(新的toolstrip分隔符());
}破;
默认:断开
}
}
}
///摘要
///通过字符串(如Ctrl Alt A ')判断按键信息
////摘要
///param name='key'/param
///返回/返回
私有void set快捷键(toolstrip menuitem tsmi,字符串键)
{
系统窗户。表格.钥匙结果=默认值(系统窗户。表格。钥匙);
string[] keys=key .拆分("");
如果(键。包含(' Ctrl '){ result |=Keys .控制;}
如果(键。包含(' Shift '){ result |=Keys .移位;}
如果(键。包含(“Alt”){ result |=Keys .Alt}
如果(键。包含(' A '){ result |=Keys .a;}
如果(键。包含(' B '){ result |=Keys .b;}
如果(键。包含(' C '){ result |=Keys .c;}
如果(键。包含(' D '){ result |=Keys .d;}
如果(键。包含(' E '){ result |=Keys .e;}
如果(键。包含(' F '){ result |=Keys .f;}
如果(键。包含(' G '){ result |=Keys .g;}
如果(键。包含(' H '){ result |=Keys .h;}
如果(键。包含(' I '){ result |=Keys .我;}
如果(键。包含(' J '){ result |=Keys .j;}
如果(键。包含(' K '){ result |=Keys .k;}
如果(键。包含(' L '){ result |=Keys .l;}
如果(键。包含(' M '){ result |=Keys .m;}
如果(键。包含(' N '){ result |=Keys .n;}
如果(键。包含(' O '){ result |=Keys .o;}
如果(键。包含(' P '){ result |=Keys .p;}
如果(键。包含(' Q '){ result |=Keys .q;}
如果(键。包含(' R '){ result |=Keys .r;}
如果(键。包含(' S '){ result |=Keys .s;}
如果(键。包含(' T '){ result |=Keys .t;}
如果(键。包含(' U '){ result |=Keys .u;}
如果(键。包含(' V '){ result |=Keys .五;}
如果(键。包含(' W '){ result |=Keys .w;}
如果(键。包含(' X '){ result |=Keys .x;}
如果(键。包含(' Y '){ result |=Keys .y;}
如果(键。包含(' Z '){ result |=Keys .z;}
如果(键。包含(' 0 '){ result |=Keys .d0;}
如果(键。包含(' 1 '){ result |=Keys .D1;}
如果(键。包含(' 2 '){ result |=Keys .D2;}
如果(键。包含(' 3 '){ result |=Keys .D3;}
如果(键。包含(' 4 '){ result |=Keys .D4;}
如果(键。包含(' 5 '){ result |=Keys .D5;}
如果(键。包含(' 6 '){ result |=Keys .D6;}
如果(键。包含(' 7 '){ result |=Keys .D7;}
如果(键。包含(' 8 '){ result |=Keys .D8;}
如果(键。包含(' 9 '){ result |=Keys .d9;}
如果(键。包含(' F1 '){ result |=Keys .f1;}
如果(键。包含(' F2 '){ result |=Keys .F2;}
如果(键。包含(' F3 '){ result |=Keys .F3;}
如果(键。包含(' F4 '){ result |=Keys .F4;}
如果(键。包含(' F5 '){ result |=Keys .F5;}
如果(键。包含(' F6 '){ result |=Keys .F6;}
如果(键。包含(' F7 '){ result |=Keys .F7;}
如果(键。包含(' F8 '){ result |=Keys .F8;}
如果(键。包含(' F9 '){ result |=Keys .F9;}
如果(键。包含(' F10 '){ result |=Keys .F10;}
如果(键。包含(' F11 '){ result |=Keys .F11}
如果(键。包含(' F12 '){ result |=Keys .F12}
tsmi .快捷键=结果;
}
///摘要
///特性备注属性,用在函数上,其注意属性决定了
///积分函数综合应该选择程序中的哪个函数进行计算
////摘要
[属性用法(属性目标。方法)]
公共类注释属性:属性
{
字符串备注;
公共字符串注释
{
获取{返回备注}
}
//构造函数
公共注释属性(字符串注释)
{
备注=评论;
}
}
///摘要
///单击一个工具条菜单项后触发的事件
////摘要
///param name='sender'/param
///param name='e'/param
私有void ToolStripMenuItem_Click(对象发送方,EventArgs e)
{
//如果标签为空,则不执行任何事件
如果(字符串IsNullOrWhiteSpace((string)((toolstrip menuitem)sender).标签))
{
返回;
}
//如果标签存在,则寻找具有和标签内容一致特性的函数并调用
函数调用((string)((toolstrip menuitem)发送方).标签);
}
///摘要
///调用具有指定特性名的函数
////摘要
///param name='funcattr '函数的评论属性特性值/param
私有void函数调用(字符串函数属性)
{
//需要使用系统。反思;
MethodInfo[] mi=typeof(FormMain).GetMethods(
绑定标志.公共|绑定标志.非公共|绑定标志.实例);
//找到具有指定特性的函数,进行调用
foreach (MethodInfo m in mi)
{
类型T2=的类型(remak属性);
remak属性ra=(remak属性)属性GetCustomAttribute(m,T2);
如果(ra!=空ra .备注==funcattr)
{
米(米的缩写))Invoke(this,new object[]{ });
打破;
}
}
}
//需要调用的函数
[remak属性(' color tored ')]//窗口底色:红
private void ChangeColorToRed(){ this .背景色=颜色。红色;}
[remak属性(' ColorToLawnGreen ')]//窗口底色:绿
private void ChangeColorToLawnGreen(){ this .背景色=颜色。劳恩格林;}
[remak属性(' form normal ')]//窗口大小:普通
private void ChangeSizeToNrm(){ this .WindowState=FormWindowState .正常;}
[remark属性(' form minimize ')]//窗口大小:最小化
private void ChangeSizeToMin(){ this .WindowState=FormWindowState .最小化;}
[remak属性(' form maximize ')]//窗口大小:最大化
private void ChangeSizeToMax(){ this .WindowState=FormWindowState .最大化;}
[remak属性(' form close ')]//退出程序
私有void关闭表单(){ Application .exit();}
[备注属性(' form about ')]//关于程序
form()的私有void { MessageBox .显示('由Tsybius 2014年5月15日撰写');}
}
}
希望本文所述对大家的C#程序设计有所帮助。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。