右键在当前位置弹出菜单

 

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;

namespace _026_右键显示菜单
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // 菜单项点击事件处理程序
        private void MenuItem_Copy_Click(object sender, EventArgs e)
        {
            // 实现复制逻辑...
            MessageBox.Show("执行复制");
        }

        private void MenuItem_Paste_Click(object sender, EventArgs e)
        {
            // 实现粘贴逻辑...
            MessageBox.Show("执行粘贴");
        }

        private void MenuItem_Delete_Click(object sender, EventArgs e)
        {
            // 实现删除选中行逻辑...
            MessageBox.Show("删除");
        }
        private ContextMenuStrip menu;
        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                // 1. 使用帮助类创建菜单
                var menuItems = new Dictionary<string, EventHandler>
        {
            { "复制", MenuItem_Copy_Click },
            { "粘贴", MenuItem_Paste_Click },
            { "删除", MenuItem_Delete_Click }
        };
                menu = ContextMenuHelper.Create(menuItems, withSeparator: true);

                // 显示菜单
                menu.Show(this,e.Location);//e.Location 是相对于屏幕的坐标,而不是相对于窗体的坐标
            }
        }
    }
    /// <summary>
    /// ContextMenuStrip 帮助类,用于简化右键菜单的创建和管理。
    /// </summary>
    public static class ContextMenuHelper
    {
        /// <summary>
        /// 创建一个新的 ContextMenuStrip 并添加菜单项。
        /// </summary>
        /// <param name="menuItems">菜单项文本和其点击事件的键值对。</param>
        /// <param name="withSeparator">是否在每个菜单项后添加分隔线(最后一个除外)。</param>
        /// <returns>配置好的 ContextMenuStrip。</returns>
        public static ContextMenuStrip Create(Dictionary<string, EventHandler> menuItems, bool withSeparator = false)
        {
            ContextMenuStrip menu = new ContextMenuStrip();

            foreach (var item in menuItems)
            {
                ToolStripMenuItem menuItem = new ToolStripMenuItem(item.Key);
                menuItem.Click += item.Value;
                menu.Items.Add(menuItem);

                if (withSeparator && menuItems.Last().Key != item.Key)
                {
                    menu.Items.Add(new ToolStripSeparator());
                }
            }
            return menu;
        }

        /// <summary>
        /// 将指定的 ContextMenuStrip 动态绑定到控件的 MouseDown 事件上,以响应右键点击。
        /// </summary>
        /// <param name="control">目标控件。</param>
        /// <param name="menu">要绑定的 ContextMenuStrip。</param>
        public static void BindToControlMouseDown(Control control, ContextMenuStrip menu)
        {
            control.MouseDown += (sender, e) =>
            {
                if (e.Button == MouseButtons.Right)
                {
                    menu.Show(control, e.Location);
                }
            };
        }

        /// <summary>
        /// 在现有菜单的指定索引位置插入一个新的菜单项。
        /// </summary>
        /// <param name="menu">目标菜单。</param>
        /// <param name="index">插入位置的索引。</param>
        /// <param name="text">新菜单项的文本。</param>
        /// <param name="clickHandler">点击事件处理程序。</param>
        public static void InsertMenuItem(ContextMenuStrip menu, int index, string text, EventHandler clickHandler)
        {
            ToolStripMenuItem newItem = new ToolStripMenuItem(text);
            newItem.Click += clickHandler;
            menu.Items.Insert(index, newItem);
        }

        /// <summary>
        /// 根据名称查找菜单中的 ToolStripMenuItem。
        /// </summary>
        /// <param name="menu">目标菜单。</param>
        /// <param name="itemName">要查找的菜单项名称(ToolStripItem.Name)。</param>
        /// <returns>找到的菜单项,未找到则返回null。</returns>
        public static ToolStripMenuItem FindMenuItemByName(ContextMenuStrip menu, string itemName)
        {
            foreach (ToolStripItem item in menu.Items)
            {
                if (item is ToolStripMenuItem menuItem && menuItem.Name == itemName)
                {
                    return menuItem;
                }
            }
            return null;
        }

        /// <summary>
        /// 根据菜单项文本动态启用或禁用菜单项。通常在菜单 Opening 事件中调用[citation:3]。
        /// </summary>
        /// <param name="menu">目标菜单。</param>
        /// <param name="itemText">菜单项文本。</param>
        /// <param name="enabled">启用状态。</param>
        public static void SetMenuItemEnabledByText(ContextMenuStrip menu, string itemText, bool enabled)
        {
            foreach (ToolStripItem item in menu.Items)
            {
                if (item.Text == itemText)
                {
                    item.Enabled = enabled;
                    break;
                }
            }
        }
    }
}

  

posted @ 2026-01-14 10:30  家煜宝宝  阅读(4)  评论(0)    收藏  举报