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;
}
}
}
}
}