珂珂的个人博客 - 一个程序猿的个人网站

菜单克隆

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.ComponentModel;

namespace WinFormLib
{
    public class MenuClone
    {
        //使用例子
        //private void Form1_Load(object sender, EventArgs e)
        //{
        //    // this.contextMenuStrip1.Items.Clear();
        //    MenuClone mc = new MenuClone();
        //    this.contextMenuStrip1.Items.Add(mc.CloneToolStripMenuItem(文件ToolStripMenuItem1, true));
        //}

        //private void 退出ToolStripMenuItem1_Click(object sender, EventArgs e)
        //{
        //    退出ToolStripMenuItem1.Checked = !退出ToolStripMenuItem1.Checked;
        //    this.contextMenuStrip1.Items.Clear();
        //    MenuClone mc = new MenuClone();
        //    this.contextMenuStrip1.Items.Add(mc.CloneToolStripMenuItem(文件ToolStripMenuItem1, true));
        //}


        private ToolStripMenuItem DestToolStripMenuItem = new ToolStripMenuItem();
        private bool IsAddSourceMenuClick = false;


        ////// 克隆某项菜单 IsDropDownItemsClone参数指定是否克隆该项菜单的子菜单 只克隆 Name ,Enabel,Text,Checked,CheckState属性和click事件 另外加了一 个click事件方法用于同步以上 属性
        //////源菜单///是否克隆子菜单///public ToolStripMenuItem CloneToolStripMenuItem(ToolStripMenuItem SourceMenu, bool IsDropDownItemsClone)
        {

            if (!IsDropDownItemsClone)
            {
                ToolStripMenuItem item = new ToolStripMenuItem();
                item.Name = SourceMenu.Name;
                item.Text = SourceMenu.Text;
                item.Checked = SourceMenu.Checked;
                item.CheckState = SourceMenu.CheckState;
                item.Enabled = SourceMenu.Enabled;

                

                PropertyInfo propertyInfo = (typeof(ToolStripItem)).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
                EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(SourceMenu, null);
                FieldInfo fieldInfo = (typeof(ToolStripItem)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
                if (fieldInfo != null)
                {
                    Delegate d = eventHandlerList[fieldInfo.GetValue(null)];
                    if (d != null)
                    {

                        foreach (Delegate de in d.GetInvocationList())
                        {
                            item.Click += (EventHandler)de;

                            //    MessageBox.Show(de.Method.Name);

                        }

                    }
                }
                if (IsAddSourceMenuClick == false)   //如果没有添加自定义事件
                {
                    //  SourceMenu.Click+=new EventHandler(SourceMenu_Click);
                    //   item.Click += new EventHandler(SourceMenu_Click);

                    IsAddSourceMenuClick = true;
                }

                return item;
            }
            else
            {
                if (SourceMenu.OwnerItem == null)   //如果是根菜单

                    // if (DestToolStripMenuItem.Name != SourceMenu.Name)
                    DestToolStripMenuItem = this.CloneToolStripMenuItem(SourceMenu, false);


                for (int i = 0; i < SourceMenu.DropDownItems.Count; i++)
                {
                    ToolStripMenuItem t = (ToolStripMenuItem)SourceMenu.DropDownItems[i];

                    if (((ToolStripMenuItem)t.OwnerItem).OwnerItem == null)  //如果上一级的上一级没有父菜单
                    {
                        // if (!DestToolStripMenuItem.DropDownItems.ContainsKey(t.Name))
                        DestToolStripMenuItem.DropDownItems.Add(this.CloneToolStripMenuItem(t, false));
                    }
                    else
                    {
                        ToolStripMenuItem fatherItem = ((ToolStripMenuItem)(DestToolStripMenuItem.DropDownItems.Find(((ToolStripMenuItem)t.OwnerItem).Name, true)[0]));
                        // if (!fatherItem.DropDownItems.ContainsKey(t.Name))
                        fatherItem.DropDownItems.Add(this.CloneToolStripMenuItem(t, false));

                    }

                    if (t.HasDropDownItems)
                    {
                        CloneToolStripMenuItem(t, true);
                    }

                }
                return DestToolStripMenuItem;
            }
        }


        ////// 为对象ContextMenuStrip,MenuStrip,ToolStripSplitButton,ToolStripDropDownButton, ToolStripMenuItem添加克隆菜单  不包含根菜单 同时会覆盖原菜单Name相同的菜单
        ////////////public void CloneToolStripMenuItem(ToolStripMenuItem SourceMenu, object obj, int StartIndex)
        {

            for (int i = StartIndex; i < SourceMenu.DropDownItems.Count + StartIndex; i++)
            {
                ToolStripMenuItem t = (ToolStripMenuItem)SourceMenu.DropDownItems[i - StartIndex];

                if (((ToolStripMenuItem)t.OwnerItem).OwnerItem == null)  //如果上一级的上一级没有父菜单
                {
                    if (obj is ContextMenuStrip)
                    {
                        if ((obj as ContextMenuStrip).Items.ContainsKey(t.Name))
                            (obj as ContextMenuStrip).Items.RemoveByKey(t.Name);
                        (obj as ContextMenuStrip).Items.Insert(i, this.CloneToolStripMenuItem(t, false));
                    }

                    if (obj is MenuStrip)
                    {
                        if ((obj as MenuStrip).Items.ContainsKey(t.Name))
                            (obj as MenuStrip).Items.RemoveByKey(t.Name);
                        (obj as MenuStrip).Items.Insert(i, this.CloneToolStripMenuItem(t, false));
                    }

                    if (obj is ToolStripSplitButton)
                    {
                        if ((obj as ToolStripSplitButton).DropDownItems.ContainsKey(t.Name))
                            (obj as ToolStripSplitButton).DropDownItems.RemoveByKey(t.Name);
                        (obj as ToolStripSplitButton).DropDownItems.Insert(i, this.CloneToolStripMenuItem(t, false));
                    }

                    if (obj is ToolStripDropDownButton)
                    {
                        if ((obj as ToolStripDropDownButton).DropDownItems.ContainsKey(t.Name))
                            (obj as ToolStripDropDownButton).DropDownItems.RemoveByKey(t.Name);
                        (obj as ToolStripDropDownButton).DropDownItems.Insert(i, this.CloneToolStripMenuItem(t, false));
                    }

                    if (obj is ToolStripMenuItem)
                    {
                        if ((obj as ToolStripMenuItem).DropDownItems.ContainsKey(t.Name))
                            (obj as ToolStripMenuItem).DropDownItems.RemoveByKey(t.Name);
                        (obj as ToolStripMenuItem).DropDownItems.Insert(i, this.CloneToolStripMenuItem(t, false));
                    }

                }
                else  //添加子菜单
                {
                    if (obj is ContextMenuStrip)
                    {
                        ToolStripMenuItem fatherItem = ((ToolStripMenuItem)((obj as ContextMenuStrip).Items.Find(((ToolStripMenuItem)t.OwnerItem).Name, true)[0]));
                        if (fatherItem.DropDownItems.ContainsKey(t.Name))
                            fatherItem.DropDownItems.RemoveByKey(t.Name);
                        fatherItem.DropDownItems.Add(this.CloneToolStripMenuItem(t, false));
                    }

                    if (obj is MenuStrip)
                    {
                        ToolStripMenuItem fatherItem = ((ToolStripMenuItem)((obj as MenuStrip).Items.Find(((ToolStripMenuItem)t.OwnerItem).Name, true)[0]));
                        if (fatherItem.DropDownItems.ContainsKey(t.Name))
                            fatherItem.DropDownItems.RemoveByKey(t.Name);
                        fatherItem.DropDownItems.Add(this.CloneToolStripMenuItem(t, false));
                    }

                    if (obj is ToolStripSplitButton)
                    {
                        ToolStripMenuItem fatherItem = ((ToolStripMenuItem)((obj as ToolStripSplitButton).DropDownItems.Find(((ToolStripMenuItem)t.OwnerItem).Name, true)[0]));
                        if (fatherItem.DropDownItems.ContainsKey(t.Name))
                            fatherItem.DropDownItems.RemoveByKey(t.Name);
                        fatherItem.DropDownItems.Add(this.CloneToolStripMenuItem(t, false));
                    }

                    if (obj is ToolStripDropDownButton)
                    {
                        ToolStripMenuItem fatherItem = ((ToolStripMenuItem)((obj as ToolStripDropDownButton).DropDownItems.Find(((ToolStripMenuItem)t.OwnerItem).Name, true)[0]));
                        if (fatherItem.DropDownItems.ContainsKey(t.Name))
                            fatherItem.DropDownItems.RemoveByKey(t.Name);
                        fatherItem.DropDownItems.Add(this.CloneToolStripMenuItem(t, false));
                    }

                    if (obj is ToolStripMenuItem)
                    {
                        ToolStripMenuItem fatherItem = ((ToolStripMenuItem)((obj as ToolStripMenuItem).DropDownItems.Find(((ToolStripMenuItem)t.OwnerItem).Name, true)[0]));
                        if (fatherItem.DropDownItems.ContainsKey(t.Name))
                            fatherItem.DropDownItems.RemoveByKey(t.Name);
                        fatherItem.DropDownItems.Add(this.CloneToolStripMenuItem(t, false));
                    }
                }

                if (t.HasDropDownItems)
                {
                    CloneToolStripMenuItem(t, obj, 0);
                }

            }

        }

        ////// 在最开始处添加菜单
        /////////public void CloneToolStripMenuItem(ToolStripMenuItem SourceMenu, object obj)
        {
            CloneToolStripMenuItem(SourceMenu, obj, 0);
        }


    }
}

 


上一篇:c#调用迅雷下载引擎

下一篇:个人代码全部开源


0 评论

查看所有评论

给个评论吧