好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#实现基于XML配置MenuStrip菜单的方法

本文实例讲述了C#实现基于XML配置MenuStrip菜单的方法。分享给大家供大家参考。具体如下:

1.关于本程序的说明

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

程序示例如下:

2.使用到的XML文档示例

?

<? xml version = "1.0" encoding = "gb2312" ?>

<!--MenuStrip:mnsMainMenu控件中的各个菜单配置-->

<!--Menu:菜单栏中的各项,Text:显示名称,ShortKey:快捷键-->

< MenuStrip >

  < Menu Text = "文件(File)" ShortKey = "Alt+F" >

  < Item Type = "MenuItem" Text = "修改窗口颜色" >

   < Item Type = "MenuItem" Text = "红色" ShortKey = "Shift+F6"

    FunctionAttribute = "ColorToRed" />

   < Item Type = "MenuItem" Text = "绿色" ShortKey = "Shift+F7"

    FunctionAttribute = "ColorToLawnGreen" />

  </ Item >

  < Item Type = "Seperator" />

  < Item Type = "MenuItem" Text = "普通" ShortKey = "Ctrl+Shift+X"

    FunctionAttribute = "FormNormal" />

  < Item Type = "MenuItem" Text = "最小化" ShortKey = "Ctrl+Shift+Y"

    FunctionAttribute = "FormMinimize" />

  < Item Type = "MenuItem" Text = "最大化" ShortKey = "Ctrl+Shift+Z"

    FunctionAttribute = "FormMaximize" />

  < Item Type = "Seperator" />

  < Item Type = "MenuItem" Text = "关闭" ShortKey = "Alt+F4"

    FunctionAttribute = "FormClose" />

  </ Menu >

  < Menu Text = "帮助(Help)" ShortKey = "Alt+F" >

  < Item Type = "MenuItem" Text = "关于" FunctionAttribute = "FormAbout" />

  </ Menu >

</ MenuStrip >

配置规则:

①.所有的内容都在标签<MenuStrip>中
②.每一个<Menu>标签代表了一个横向的菜单项,其中Text属性是显示的文字,ShortKey属性是选择用的快捷键
③.每一个<Item>标签都在<Menu>或<Item>标签下,表示一个菜单项,菜单项里面可以嵌套其他的Item菜单项。
④.<Item>标签的Type属性代表了此像的类型,分为Seperator和MenuItem两类,前者对应ToolStripItem类,后者对应ToolStripSeparator类
⑤.<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" );

   }

   /// <summary>

   /// 设置MenuStrip控件

   /// </summary>

   /// <param name="address"></param>

   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);

   }

   /// <summary>

   /// 设置MenuStrip控件第一层菜单及其子菜单

   /// </summary>

   /// <param name="ms">MenuStrip控件</param>

   /// <param name="xnode">XML结点</param>

   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);

    }

   }

   /// <summary>

   /// 设置 ToolStripMenuItem 控件及其子菜单(递归设置)

   /// </summary>

   /// <param name="tsmi">ToolStripMenuItem控件</param>

   /// <param name="xnode">XML结点</param>

   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 ;

     }

    }

   }

   /// <summary>

   /// 通过字符串(如"Ctrl+Alt+A")判断按键信息

   /// </summary>

   /// <param name="key"></param>

   /// <returns></returns>

   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;

   }

   /// <summary>

   /// 特性 RemarkAttribute,用在函数上,其 Remark 属性决定了

   /// 积分函数 Integration 应该选择程序中的哪个函数进行计算

   /// </summary>

   [AttributeUsage(AttributeTargets.Method)]

   public class RemarkAttribute : Attribute

   {

    string remark;

    public string Remark

    {

     get { return remark; }

    }

    //构造函数

    public RemarkAttribute( string comment)

    {

     remark = comment;

    }

   }

   /// <summary>

   /// 单击一个ToolStripMenuItem后触发的事件

   /// </summary>

   /// <param name="sender"></param>

   /// <param name="e"></param>

   private void ToolStripMenuItem_Click( object sender, EventArgs e)

   {

    //如果Tag为空,则不执行任何事件

    if ( string .IsNullOrWhiteSpace(( string )((ToolStripMenuItem)sender).Tag))

    {

     return ;

    }

    //如果Tag存在,则寻找具有和Tag内容一致特性的函数并调用

    FunctionInvoke(( string )((ToolStripMenuItem)sender).Tag);

   }

   /// <summary>

   /// 调用具有指定特性名的函数

   /// </summary>

   /// <param name="funcattr">函数的RemarkAttribute特性值</param>

   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" ); }

  }

}

希望本文所述对大家的C#程序设计有所帮助。

dy("nrwz");

查看更多关于C#实现基于XML配置MenuStrip菜单的方法的详细内容...

  阅读:83次