C#在普通Windows form程序中动态加载菜单的文章很多,但搜了半天发现WPF中动态菜单项目的介绍很少。是不是我 的想法很奇怪呢?呵呵,不管了,记录一下实现过程。
private void MainFrm_Load(object sender, EventArgs e) { LoadAllPlugs(); //加载所有组件 LoadAllMenus(); //加载菜单 } //加载主菜单函数 private void SetMenu(MenuStrip mMain, string mName) { try { string strSql; int i; IDBOperator db = DBOperator.GetInstance(); strSql = "SELECT * FROM SYS_Plugsins WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence"; DataTable dt = new DataTable(); dt = db.ReturnDataTable(strSql); if (dt.Rows.Count > 0) { for (i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["FParentNo"].ToString() == "0") { ToolStripMenuItem mItem; mItem = new ToolStripMenuItem(dt.Rows[i]["FMenuText"].ToString()); mItem.Name = dt.Rows[i]["FMenuName"].ToString(); mItem.AccessibleDescription = dt.Rows[i]["FPlugsins"].ToString(); //借用这个属性 mMain.Items.Add(mItem); SetSubMenu((ToolStripMenuItem)mMain.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString()); } } } } catch { MessageBox.Show("创建主菜单时出错", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error); } } //加载子菜单函数 private void SetSubMenu(ToolStripMenuItem mItem, string mName) { try { string strSql; int i; //查询数据库 strSql = "SELECT * FROM SYS_Plugsins WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence"; IDBOperator db = DBOperator.GetInstance(); DataTable dt = new DataTable(); dt = db.ReturnDataTable(strSql); for (i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["FParentNo"].ToString() == mName) { ToolStripMenuItem mSubItem; EventHandler eh = GetEvent(dt.Rows[i]["FMenuEvent"]); //获得操作事件 Keys key = GetShurtcutKeys(dt.Rows[i]["FMenuShortcutKeys"]);//获得快捷键 //创建菜单项 mSubItem = new ToolStripMenuItem(dt.Rows[i]["FMenuText"].ToString(), imageList1.Images[(int)dt.Rows[i]["FMenuIcon"]], eh, key); mSubItem.Name = dt.Rows[i]["FMenuName"].ToString(); mSubItem.AccessibleDescription = dt.Rows[i]["FPlugsins"].ToString(); mItem.DropDownItems.Add(mSubItem); //设置子菜单 SetSubMenu((ToolStripMenuItem)mItem.DropDownItems[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString()); } } } catch { MessageBox.Show("创建子菜单时出错", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
这三个函数主要完成在普通Windows form程序中动态Menu的方法,先记录在这里。
在WPF中没有MenuStrip控件,只有Menu控件了,这个控件是可以无限级别展开的。所以程序应该是下面这个样子(有错误):
//加载主菜单函数 private void SetMenu(Menu mMain, string mName) { try { string strSql; int i; IDBOperator db = DBOperator.GetInstance(); strSql = "SELECT * FROM SYS_Plugsins WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence"; DataTable dt = new DataTable(); dt = db.ReturnDataTable(strSql); if (dt.Rows.Count > 0) { for (i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["FParentNo"].ToString() == "0") { MenuItem mItem; mItem = new MenuItem(); mItem.Header = dt.Rows[i]["FMenuText"].ToString(); mItem.Name = dt.Rows[i]["FMenuName"].ToString(); //mItem.AccessibleDescription = dt.Rows[i]["FPlugsins"].ToString(); //借用这个属性 mMain.Items.Add(mItem); SetSubMenu((MenuItem)mMain.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString()); } } } } catch { MessageBox.Show("创建主菜单时出错", "出错"); } } //加载子菜单函数 private void SetSubMenu(MenuItem mItem, string mName) { try { string strSql; int i; //查询数据库 strSql = "SELECT * FROM SYS_Plugsins WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence"; IDBOperator db = DBOperator.GetInstance(); DataTable dt = new DataTable(); dt = db.ReturnDataTable(strSql); for (i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["FParentNo"].ToString() == mName) { MenuItem mSubItem; //EventHandler eh = GetEvent(dt.Rows[i]["FMenuEvent"]); //获得操作事件 //Keys key = GetShurtcutKeys(dt.Rows[i]["FMenuShortcutKeys"]);//获得快捷键 //创建菜单项 mSubItem = new MenuItem(); mSubItem.Header = dt.Rows[i]["FMenuText"].ToString(); mSubItem.Name = dt.Rows[i]["FMenuName"].ToString(); //mSubItem.AccessibleDescription = dt.Rows[i]["FPlugsins"].ToString(); mItem.Items.Add(mSubItem); //设置子菜单 SetSubMenu((MenuItem)mItem.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString()); } } } catch { MessageBox.Show("创建子菜单时出错", "出错"); } }
问题出现在:
SetSubMenu((ToolStripMenuItem)mMain.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());
转化为
SetSubMenu((MenuItem)mMain.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());
等待处理中......