如题所述,我们经常用到动态菜单,不过或多或少都遇到一些问题和缺陷,谁有比较解决比较完善的代码或思路,可以贴上来让大家学习学习!
谢谢支持!

解决方案 »

  1.   

    public ContextMenuStrip MainMenu = null;
    public void CreateMainMenu(IList menuItems)
    {
    if (MainMenu == null)
    {
    MainMenu = new ContextMenuStrip();
    foreach (object item in menuItems)
    {
    ToolStripMenuItem mi = null; mi = new ToolStripMenuItem((string)GetValue(item, "Caption"));
    mi.Name = GetValue(item, "Id").ToString();
    //mi.ShortcutKeys = (Keys)item["ShortCut"];
    mi.Tag = item;
    mi.Click += new EventHandler(MenuClick);
    string iconFile = (string)GetValue(item, "Icon");
    if (System.IO.File.Exists(iconFile))
    {
    mi.Image = Image.FromFile(iconFile);
    }
    Guid fatherId = (Guid)GetValue(item, "FatherId");
    bool separater = (bool)GetValue(item, "Separater");
    if (fatherId == Guid.Empty)
    {
    if (separater)
    MainMenu.Items.Add("-");
    MainMenu.Items.Add(mi);
    }
    else
    AddChildMenu(fatherId.ToString(), mi, MainMenu.Items, separater);
    }
    }
    MainMenu.Items.Add("-");
                Assembly a = Assembly.GetExecutingAssembly();
                System.Drawing.Image img = Image.FromStream(a.GetManifestResourceStream(a.GetName().Name + ".Images.help.ico"));
                MainMenu.Items.Add("帮助与支持", img, MenuHelp);
                if (ApplicationDeployment.IsNetworkDeployed)
                    MainMenu.Items.Add("检查更新", null, MenuCheckUpdate);
    MainMenu.Items.Add("关于...", null, MenuAbout);
    MainMenu.Items.Add("-");
                m_MinMenu = new ToolStripMenuItem("最小化", null, MenuMin);
                MainMenu.Items.Add(m_MinMenu);
                if (MainForm.WindowState == FormWindowState.Normal)
                    m_MaxMenu = new ToolStripMenuItem("最大化", null, MenuMax);
                else
                    m_MaxMenu = new ToolStripMenuItem("还原", null, MenuMax);
                MainMenu.Items.Add(m_MaxMenu);
                MainMenu.Items.Add("-");
    MainMenu.Items.Add("退出系统", null, MenuExit);
    MainMenu.Show(1500, 1500);
    }
    private object GetValue(object obj, string propertyName)
    {
    System.Reflection.PropertyInfo pi = obj.GetType().GetProperty(propertyName);
    if (null != pi)
    return pi.GetValue(obj, null);
    return null;
    }
    private bool AddChildMenu(string key, ToolStripMenuItem item, ToolStripItemCollection items, bool hasSeparator)
    {
    if (items == null)
    return false;
    ToolStripMenuItem pmi = items[key] as ToolStripMenuItem; if (pmi == null)
    {
    foreach (ToolStripItem mi in items)
    {
    if (mi is ToolStripSeparator) continue;     // skip the separator line
    if ((pmi = ((mi as ToolStripMenuItem).DropDownItems[key] as ToolStripMenuItem)) != null)
    break;
    }
    }
    if (pmi != null)
    {
    if (hasSeparator)
    pmi.DropDownItems.Add("-");
    pmi.DropDownItems.Add(item);
    pmi.Click -= new EventHandler(MenuClick);
    return true;
    }
    else
    foreach (ToolStripItem mi in items)
    {
    if (mi is ToolStripSeparator) continue;     // skip the separator line
    if (AddChildMenu(key, item, (mi as ToolStripMenuItem).DropDownItems, hasSeparator))
    return true;
    }
    return false;
    }
    #region Menu Event
    public void MenuClick(object sender, EventArgs e)
    {
    object menu = null;
    if (sender is ToolStripItem)
                    menu = (sender as ToolStripItem).Tag;
    else if (sender is ListViewItem)
                    menu = (sender as ListViewItem).Tag;
    if (menu != null)
    KiteModule.Instance.RunModule((string)GetValue(menu, "ModuleName"), (string)GetValue(menu, "TypeName"));
    }
    private void MenuHelp(object sender, EventArgs e)
    {
    if (ShowHelp != null)
    ShowHelp(sender, EventArgs.Empty);
    }
    private void MenuAbout(object sender, EventArgs e)
    {
    if (ShowAbout != null)
    ShowAbout(sender, EventArgs.Empty);
    }
            private void MenuExit(object sender, EventArgs e)
            {
                Application.Exit();
            }
            private void MenuCheckUpdate(object sender, EventArgs e)
    {
                KiteSoft.Utils.Update.CheckUpdate();
    }
    private void MenuMin(object sender, EventArgs e)
    {
                //foreach (BaseForm frm in BaseForm.FormList)
                //    frm.WindowState = FormWindowState.Minimized;
                MainForm.WindowState = FormWindowState.Minimized;
    }
            private void MenuMax(object sender, EventArgs e)
            {
                //foreach (BaseForm frm in BaseForm.FormList)
                //    frm.WindowState = FormWindowState.Minimized;
                if (MainForm.WindowState == FormWindowState.Normal)
                {
                    MainForm.WindowState = FormWindowState.Maximized;
                    m_MaxMenu.Text = "还原";
                }
                else
                {
                    MainForm.WindowState = FormWindowState.Normal;
                    m_MaxMenu.Text = "最大化";
                }
            }
    #endregion
      

  2.   

    thanks , it's very good !