栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

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

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

1.关于本程序的说明

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

程序示例如下:

2.使用到的XML文档示例





 
 
  
  
 
 
 
 
 
 
 
 
 
  
 


配置规则:

①.所有的内容都在标签
②.每一个

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/124822.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号