最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年08月14日 15:56:05   作者:北風其涼  
這篇文章主要介紹了C#實現基于XML配置MenuStrip菜單的方法,涉及C#使用XML配置MenuStrip菜單的原理與實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了C#實現基于XML配置MenuStrip菜單的方法。分享給大家供大家參考。具體如下:

1.關于本程序的說明

用XML配置MenuStrip菜單,本程序只是提供一個思路。程序在Load函數中根據XML文件中的設置動態(tài)生成一個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>

配置規(guī)則:

①.所有的內容都在標簽<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后觸發(fā)的事件
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void ToolStripMenuItem_Click(object sender, EventArgs e)
  {
   //如果Tag為空,則不執(zhí)行任何事件
   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#程序設計有所幫助。

相關文章

  • WinForm使用正則表達式提取內容的方法示例

    WinForm使用正則表達式提取內容的方法示例

    這篇文章主要介紹了WinForm使用正則表達式提取內容的方法,結合實例形式分析了WinForm基于正則匹配獲取指定內容的相關操作技巧,需要的朋友可以參考下
    2017-05-05
  • C#中如何自定義配置上周和本周起始日來查詢業(yè)務數據(思路詳解)

    C#中如何自定義配置上周和本周起始日來查詢業(yè)務數據(思路詳解)

    在C#中并沒有封裝的方法根據我們需要來直接獲取上一周某天到某天、本周某天到某天,所以需要我們自己封裝方法來實現(我們也可以按照這個思路使用其他語言來實現),感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • C#中string用法實例詳解

    C#中string用法實例詳解

    這篇文章主要介紹了C#中string用法,非常詳細的總結了比較常見的關于C#中string的幾個常用方法,需要的朋友可以參考下
    2014-08-08
  • 淺析WPF中ToolTip工具提示的應用

    淺析WPF中ToolTip工具提示的應用

    在日常應用中,當鼠標放置在某些控件上時,都會有相應的信息提示,從軟件易用性上來說,這是一個非常友好的功能設計,本文就來和大家簡單聊聊WPF中ToolTip工具提示的相關使用,有興趣的可以了解下
    2023-12-12
  • C# .NET 中的緩存實現詳情

    C# .NET 中的緩存實現詳情

    軟件開發(fā)中最常用的模式之一是 緩存 ,其包括進程內緩存、持久性進程內緩存和分布式緩存,本文我們將主要介紹進程內緩存,需要的朋友可以參考下面文章的具體內容
    2021-09-09
  • C#實現23種常見的設計模式的示例詳解

    C#實現23種常見的設計模式的示例詳解

    設計模式通常分為三個主要類別:創(chuàng)建型模式、結構型模式和行為型模式,這些模式是用于解決常見的對象導向設計問題的最佳實踐,本文為大家整理了23種常見的設計模式的實現代碼,需要的可以參考一下
    2023-06-06
  • C#實現基于Base64的加密解密類實例

    C#實現基于Base64的加密解密類實例

    這篇文章主要介紹了C#實現基于Base64的加密解密類,實例分析了C#基于Base64的加密解密實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#圖形區(qū)域剪切的實現方法

    C#圖形區(qū)域剪切的實現方法

    這篇文章主要介紹了C#圖形區(qū)域剪切的實現方法,涉及C#圖形操作的相關技巧,需要的朋友可以參考下
    2015-06-06
  • 在C#中如何使用JSON

    在C#中如何使用JSON

    JSON(JavaScript?Object?Notation)是一種輕量級的數據交換格式,具有易讀、易解析的特點,廣泛用于API數據交互、配置文件等,本文介紹在C#中如何使用JSON,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • C#利用ms office實現office轉pdf的示例代碼

    C#利用ms office實現office轉pdf的示例代碼

    這篇文章主要介紹了C#利用ms office實現office轉pdf的詳細方法,文中通過代碼示例和圖文講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-09-09

最新評論

大理市| 永城市| 灵台县| 金寨县| 霍城县| 收藏| 印江| 澎湖县| 葫芦岛市| 榕江县| 洛南县| 赣州市| 大足县| 泗水县| 始兴县| 肃北| 鄯善县| 望谟县| 新蔡县| 昭通市| 若尔盖县| 定日县| 玉龙| 墨江| 江源县| 宜章县| 博白县| 彰武县| 绥阳县| 公主岭市| 佛教| 大宁县| 太康县| 乡宁县| 府谷县| 沂南县| 马尔康县| 砚山县| 新竹县| 久治县| 南皮县|