博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#实现用XML配置MenuStrip菜单
阅读量:6243 次
发布时间:2019-06-22

本文共 10605 字,大约阅读时间需要 35 分钟。

hot3.png

1.关于本程序的说明

用XML配置MenuStrip菜单,本程序只是提供一个思路。程序在Load函数中根据XML文件中的设置动态生成一个MenuStrip组件的Items集合。

程序示例如下:

161432_v6fd_1425762.png

2.使用到的XML文档示例

 

配置规则:

1.所有的内容都在标签<MenuStrip>中

2.每一个<Menu>标签代表了一个横向的菜单项,其中Text属性是显示的文字,ShortKey属性是选择用的快捷键

3.每一个<Item>标签都在<Menu>或<Item>标签下,表示一个菜单项,菜单项里面可以嵌套其他的Item菜单项。

4.<Item>标签的Type属性代表了此像的类型,分为Seperator和MenuItem两类,前者对应ToolStripItem类,后者对应ToolStripSeparator类

5.<Item>标签中,Type属性为MenuItem时,还可以设置Text属性(显示文字)、ShortKey属性(快捷键)、FunctionAttribute属性(生成实例后,单击此菜单项需要调用的函数绑定特性值)

另:在本程序中单击生成后的菜单调用的是一个函数,该函数上方有一个RemarkAttribute特性,FunctionAttribute属性的值如果与之一致则调用该函数。这个特性的设计并不是死的,在本程序中是函数,经过修改后,也可以对应自定义控件、类等。

3.关于程序窗体

程序窗体没有设置其他的属性,只有一个空的MenuStrip,名为mnsMainMenu。窗体的名称为FormMain。

4.程序代码

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Xml;using System.Reflection;namespace Program22{    public partial class FormMain : Form    {        public FormMain()        {            InitializeComponent();        }        //1.把MenuConfig.xml中的信息反映到菜单mnsMainMenu上        //2.显示文本、快捷键等信息直接添加,FunctionName属性添加到Tag中        //3.通过反射找到对应函数,完成操作        private void Form1_Load(object sender, EventArgs e)        {            SetMainMenu("MenuConfig.xml");        }        ///         /// 设置MenuStrip控件        ///         ///         private void SetMainMenu(string address)        {            //设置前清空MenuStrip中所有项            mnsMainMenu.Items.Clear();            //读取XML文件            XmlDocument xmlDoc = new XmlDocument();            xmlDoc.Load(address);            XmlNode root = xmlDoc.SelectSingleNode("MenuStrip");            SetMenu(mnsMainMenu, root);        }        ///         /// 设置MenuStrip控件第一层菜单及其子菜单        ///         /// MenuStrip控件        /// XML结点        private void SetMenu(MenuStrip ms, XmlNode xnode)        {            foreach (XmlNode xn in xnode.ChildNodes)            {                XmlElement xe = (XmlElement)xn;                ToolStripMenuItem newtsmi = new ToolStripMenuItem(xe.GetAttribute("Text"));                //设置快捷键                if (string.IsNullOrWhiteSpace(xe.GetAttribute("ShortKey")))                {                    SetShortKey(newtsmi, xe.GetAttribute("ShortKey"));                }                //设置调用函数                if (!string.IsNullOrWhiteSpace(xe.GetAttribute("FunctionAttribute")))                {                    newtsmi.Tag = xe.GetAttribute("FunctionAttribute");                    newtsmi.Click += ToolStripMenuItem_Click;                }                //设置子菜单                if (xn.ChildNodes.Count != 0)                {                    SetItem(newtsmi, xn);                }                ms.Items.Add(newtsmi);            }        }        ///         /// 设置 ToolStripMenuItem 控件及其子菜单(递归设置)        ///         /// ToolStripMenuItem控件        /// XML结点        private void SetItem(ToolStripMenuItem tsmi, XmlNode xnode)        {            foreach (XmlNode xn in xnode.ChildNodes)            {                XmlElement xe = (XmlElement)xn;                ToolStripMenuItem newtsmi = new ToolStripMenuItem(xe.GetAttribute("Text"));                switch (xe.GetAttribute("Type"))                {                    case "MenuItem":                         {                            //设置快捷键                            if (!string.IsNullOrWhiteSpace(xe.GetAttribute("ShortKey")))                            {                                SetShortKey(newtsmi, xe.GetAttribute("ShortKey"));                            }                            //设置调用函数                            if (!string.IsNullOrWhiteSpace(                                xe.GetAttribute("FunctionAttribute")))                            {                                newtsmi.Tag = xe.GetAttribute("FunctionAttribute");                                newtsmi.Click += ToolStripMenuItem_Click;                            }                            //设置子菜单                            if (xn.ChildNodes.Count != 0)                            {                                SetItem(newtsmi, xn);                            }                            tsmi.DropDownItems.Add(newtsmi as ToolStripItem);                        } break;                    case "Seperator":                        {                            tsmi.DropDownItems.Add(new ToolStripSeparator());                        } break;                    default: break;                }            }        }        ///         /// 通过字符串(如"Ctrl+Alt+A")判断按键信息        ///         ///         /// 
private void SetShortKey(ToolStripMenuItem tsmi, string key) { System.Windows.Forms.Keys result = default(System.Windows.Forms.Keys); string[] keys = key.Split('+'); if (keys.Contains("Ctrl")) { result |= Keys.Control; } if (keys.Contains("Shift")) { result |= Keys.Shift; } if (keys.Contains("Alt")) { result |= Keys.Alt; } if (keys.Contains("A")) { result |= Keys.A; } if (keys.Contains("B")) { result |= Keys.B; } if (keys.Contains("C")) { result |= Keys.C; } if (keys.Contains("D")) { result |= Keys.D; } if (keys.Contains("E")) { result |= Keys.E; } if (keys.Contains("F")) { result |= Keys.F; } if (keys.Contains("G")) { result |= Keys.G; } if (keys.Contains("H")) { result |= Keys.H; } if (keys.Contains("I")) { result |= Keys.I; } if (keys.Contains("J")) { result |= Keys.J; } if (keys.Contains("K")) { result |= Keys.K; } if (keys.Contains("L")) { result |= Keys.L; } if (keys.Contains("M")) { result |= Keys.M; } if (keys.Contains("N")) { result |= Keys.N; } if (keys.Contains("O")) { result |= Keys.O; } if (keys.Contains("P")) { result |= Keys.P; } if (keys.Contains("Q")) { result |= Keys.Q; } if (keys.Contains("R")) { result |= Keys.R; } if (keys.Contains("S")) { result |= Keys.S; } if (keys.Contains("T")) { result |= Keys.T; } if (keys.Contains("U")) { result |= Keys.U; } if (keys.Contains("V")) { result |= Keys.V; } if (keys.Contains("W")) { result |= Keys.W; } if (keys.Contains("X")) { result |= Keys.X; } if (keys.Contains("Y")) { result |= Keys.Y; } if (keys.Contains("Z")) { result |= Keys.Z; } if (keys.Contains("0")) { result |= Keys.D0; } if (keys.Contains("1")) { result |= Keys.D1; } if (keys.Contains("2")) { result |= Keys.D2; } if (keys.Contains("3")) { result |= Keys.D3; } if (keys.Contains("4")) { result |= Keys.D4; } if (keys.Contains("5")) { result |= Keys.D5; } if (keys.Contains("6")) { result |= Keys.D6; } if (keys.Contains("7")) { result |= Keys.D7; } if (keys.Contains("8")) { result |= Keys.D8; } if (keys.Contains("9")) { result |= Keys.D9; } if (keys.Contains("F1")) { result |= Keys.F1; } if (keys.Contains("F2")) { result |= Keys.F2; } if (keys.Contains("F3")) { result |= Keys.F3; } if (keys.Contains("F4")) { result |= Keys.F4; } if (keys.Contains("F5")) { result |= Keys.F5; } if (keys.Contains("F6")) { result |= Keys.F6; } if (keys.Contains("F7")) { result |= Keys.F7; } if (keys.Contains("F8")) { result |= Keys.F8; } if (keys.Contains("F9")) { result |= Keys.F9; } if (keys.Contains("F10")) { result |= Keys.F10; } if (keys.Contains("F11")) { result |= Keys.F11; } if (keys.Contains("F12")) { result |= Keys.F12; } tsmi.ShortcutKeys = result; } /// /// 特性 RemarkAttribute,用在函数上,其 Remark 属性决定了 /// 积分函数 Integration 应该选择程序中的哪个函数进行计算 /// [AttributeUsage(AttributeTargets.Method)] public class RemarkAttribute : Attribute { string remark; public string Remark { get { return remark; } } //构造函数 public RemarkAttribute(string comment) { remark = comment; } } /// /// 单击一个ToolStripMenuItem后触发的事件 /// /// /// private void ToolStripMenuItem_Click(object sender, EventArgs e) { //如果Tag为空,则不执行任何事件 if (string.IsNullOrWhiteSpace((string)((ToolStripMenuItem)sender).Tag)) { return; } //如果Tag存在,则寻找具有和Tag内容一致特性的函数并调用 FunctionInvoke((string)((ToolStripMenuItem)sender).Tag); } /// /// 调用具有指定特性名的函数 /// /// 函数的RemarkAttribute特性值 private void FunctionInvoke(string funcattr) { //需要 using System.Reflection; MethodInfo[] mi = typeof(FormMain).GetMethods( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); //找到具有指定特性的函数,进行调用 foreach (MethodInfo m in mi) { Type t2 = typeof(RemarkAttribute); RemarkAttribute ra = (RemarkAttribute)Attribute.GetCustomAttribute(m, t2); if (ra != null && ra.Remark == funcattr) { m.Invoke(this, new object[] { }); break; } } } //需要调用的函数 [RemarkAttribute("ColorToRed")] //窗口底色:红 private void ChangeColorToRed() { this.BackColor = Color.Red; } [RemarkAttribute("ColorToLawnGreen")] //窗口底色:绿 private void ChangeColorToLawnGreen() { this.BackColor = Color.LawnGreen; } [RemarkAttribute("FormNormal")] //窗口大小:普通 private void ChangeSizeToNrm() { this.WindowState = FormWindowState.Normal; } [RemarkAttribute("FormMinimize")] //窗口大小:最小化 private void ChangeSizeToMin() { this.WindowState = FormWindowState.Minimized; } [RemarkAttribute("FormMaximize")] //窗口大小:最大化 private void ChangeSizeToMax() { this.WindowState = FormWindowState.Maximized; } [RemarkAttribute("FormClose")] //退出程序 private void CloseForm() { Application.Exit(); } [RemarkAttribute("FormAbout")] //关于程序 private void AboutForm() { MessageBox.Show("Write By Tsybius 2014/5/15"); } }}

END

转载于:https://my.oschina.net/Tsybius2014/blog/265279

你可能感兴趣的文章
# 2017-2018-1 20155224 《信息安全系统设计基础》第七周学习总结
查看>>
scikit-learn预处理实例之一:使用FunctionTransformer选择列
查看>>
Oracle11G 卸载步骤
查看>>
Mars说光场(3)— 光场采集
查看>>
中小企业客户营收增长将成微博2016年主推动力
查看>>
第一个掘金文章
查看>>
我的友情链接
查看>>
微信Windows版无法备份聊天记录
查看>>
Github上传代码菜鸟超详细教程
查看>>
资金项目性能优化
查看>>
Java将图片处理成背景透明的圆形图片
查看>>
知道IP地址怎么查看mac地址
查看>>
2016年度总结
查看>>
对于常见未得到支持操作的理解
查看>>
Win7 下Maple驱动问题解决方案
查看>>
hibernate 不输出sql参数的解决
查看>>
Netty的异步事件驱动(ChannelFuture)
查看>>
PostgreSQL数据类型-货币类型
查看>>
eclipse.ini、flashbuilder.ini内存设置和堆栈非堆栈问题
查看>>
线程下变量-原子操作 __sync_fetch_and_add等等
查看>>