亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#實現基于XML配置MenuStrip菜單的方法

2020-01-24 01:32:20
字體:
來源:轉載
供稿:網友

本文實例講述了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#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲日本欧美中文幕| 国产mv免费观看入口亚洲| 一区二区三区四区精品| 成人免费高清完整版在线观看| 亚洲精品视频在线观看视频| 亚洲成人999| 久久国产精品久久久| 超在线视频97| 亚洲视频在线看| 亚洲理论在线a中文字幕| 少妇久久久久久| 国产欧美一区二区三区在线看| 国产亚洲精品久久久久动| 91免费欧美精品| 这里只有精品在线播放| 亚洲欧美国产精品专区久久| 57pao成人国产永久免费| 亚洲japanese制服美女| 亚洲国产精彩中文乱码av| 最近2019中文字幕在线高清| 在线电影中文日韩| 色一区av在线| 精品久久久久久电影| 亚洲一区二区免费| 成人h猎奇视频网站| 国产美女被下药99| 成人在线播放av| 亚洲男人天堂古典| 欧美精品18videos性欧美| 亚洲精品wwww| 91影院在线免费观看视频| 久久在线观看视频| 国产精品久久久久久久久免费看| 精品一区二区三区四区| 国产精品中文字幕在线| 欧美国产极速在线| 欧美激情在线观看| 国产一区二区动漫| 欧美成人一区二区三区电影| 日韩av在线影院| 日韩av电影在线免费播放| 欧美多人爱爱视频网站| 国产精品亚洲欧美导航| 国产免费一区二区三区在线观看| 欧美精品电影免费在线观看| 日韩欧美在线视频观看| 午夜精品福利在线观看| 国产精品嫩草影院久久久| 国产精品偷伦视频免费观看国产| 91精品在线观看视频| 2019中文在线观看| 欧美日韩国产限制| 国产综合在线视频| 奇米四色中文综合久久| 日韩精品在线观看一区| 久久久999成人| 亚洲精品免费网站| 国产成人久久久精品一区| 日韩有码片在线观看| 日韩成人中文电影| 最近2019免费中文字幕视频三| 一区二区三区回区在观看免费视频| 久久精品亚洲94久久精品| 成人激情黄色网| 日韩中文字幕视频在线观看| 成人精品久久一区二区三区| 中文字幕日韩av综合精品| 亚洲色图第一页| 亚洲另类激情图| 欧美成人一区在线| 亚洲精品狠狠操| 97精品国产91久久久久久| 亚洲成人久久久| 亚洲黄页网在线观看| 亚洲欧美日韩久久久久久| 亚洲欧美日韩国产精品| 亚洲电影成人av99爱色| 日本91av在线播放| 中文字幕国产亚洲| 久久视频在线看| 国产亚洲精品久久久优势| 欧美亚洲第一区| 久久国产精品偷| 992tv在线成人免费观看| 日韩精品免费在线视频观看| 亚洲高清久久久久久| 性金发美女69hd大尺寸| 成人啪啪免费看| 精品国产91久久久久久| 国外成人在线视频| 亚洲欧美国产日韩天堂区| 91精品国产色综合久久不卡98口| 超碰精品一区二区三区乱码| 色综合久久88| 国外日韩电影在线观看| 国产日韩在线看片| 国产婷婷色综合av蜜臀av| 亚洲精品电影在线观看| 国产精品老牛影院在线观看| 26uuu久久噜噜噜噜| 久久中文精品视频| 久久99热精品这里久久精品| 国产日韩欧美自拍| 国产精品黄色av| 日韩亚洲欧美成人| 成人有码视频在线播放| 久久精品在线播放| 亚洲色图第三页| 国产亚洲精品美女| 国产91精品最新在线播放| 国产精品久久久久秋霞鲁丝| 成人免费在线视频网站| 久久久久久亚洲精品不卡| 日韩av片免费在线观看| 日韩精品高清在线观看| 久久免费视频在线| 久久久成人精品| 日本免费在线精品| 国产精品扒开腿做爽爽爽男男| 亚洲男女自偷自拍图片另类| 中文字幕最新精品| 高跟丝袜欧美一区| 欧美日本高清视频| 国产精品中文字幕久久久| 一区二区在线视频播放| 久久av在线播放| 亚洲人成网在线播放| 91中文字幕一区| 日韩成人在线电影网| 欧美激情女人20p| 欧美怡红院视频一区二区三区| 国产欧美va欧美va香蕉在| 欧美性猛交xxxx免费看漫画| 欧美诱惑福利视频| 欧美亚洲伦理www| 亚洲色图av在线| 国产精品丝袜一区二区三区| 久久久av一区| 91精品国产亚洲| 国产精品福利在线观看| 亚洲性无码av在线| 欧美裸体xxxxx| 久热精品视频在线观看一区| 国产成人精品在线| 欧美日韩国产精品一区二区三区四区| 日本人成精品视频在线| 亚洲天堂一区二区三区| 操日韩av在线电影| 欧美激情按摩在线| 色综合天天狠天天透天天伊人| 国产精品成人va在线观看| 久久九九精品99国产精品| 亚洲片在线资源| 国产在线不卡精品| 在线电影av不卡网址| 精品久久久久久亚洲国产300| 成人乱色短篇合集| 久久久久久久色| 91av成人在线| 亚洲欧洲自拍偷拍| 57pao成人国产永久免费| 欧美一区二区三区免费观看| 欧洲永久精品大片ww免费漫画| 色综合久综合久久综合久鬼88|