C# 如何将ContextMenuStrip添加到ToolStripMenuItem

C# 如何将ContextMenuStrip添加到ToolStripMenuItem,c#,winforms,binding,contextmenu,C#,Winforms,Binding,Contextmenu,我希望当我点击菜单项时,显示一个上下文菜单,其中包含诸如“删除”、“重命名”等项 如何在右键单击菜单项时绑定上下文菜单?我想到的第一个想法是在ToolStripMenuItem上连接一些MouseDown事件,并在屏幕坐标中的鼠标位置显示第二个ContextMenuStrip。但事情并非如此简单。问题是这样做需要为每个项连接事件,在该事件上以某种方式显示第二个ContextMenuStrip将关闭当前ContextMenuStrip(即使我们添加了一些Closing事件处理程序并设置e.Canc

我希望当我点击菜单项时,显示一个上下文菜单,其中包含诸如“删除”、“重命名”等项


如何在右键单击菜单项时绑定上下文菜单?

我想到的第一个想法是在
ToolStripMenuItem
上连接一些
MouseDown
事件,并在屏幕坐标中的鼠标位置显示第二个
ContextMenuStrip
。但事情并非如此简单。问题是这样做需要为每个项连接事件,在该事件上以某种方式显示第二个
ContextMenuStrip
将关闭当前ContextMenuStrip(即使我们添加了一些
Closing
事件处理程序并设置
e.Cancel=true;
)。这里有点棘手。我们可以想到当前
ContextMenuStrip
MouseDown
事件,但实际上这个事件很难触发,因为所有项目都位于
ContextMenuStrip
的顶部。这让我想到了更深层的阶段,我们可以抓住
WM_RBUTTONDOWN
并在那里运行代码。我们可以自定义
ContextMenuStrip
以在
WndProc
中捕获该消息,也可以使用自定义的
NativeWindow
。我想在这里使用
NativeWindow
。现在是编写代码(完美工作)的时候了:

用法::重要事件是
ShowContextMenu
,连接此事件并设置要显示的
ContextMenuStrip
。这就是全部。详情如下:

public partial class Form1 : Form {
  public Form1(){
     InitializeComponent();
     //suppose you have a main ContextMenuStrip and a sub ContextMenuStrip
     //try adding some items for both
     ContextMenuStrip = new ContextMenuStrip();
     ContextMenuStrip.Items.Add("Item 1");
     ContextMenuStrip.Items.Add("Item 2");
     //sub ContextMenuStrip
     var subMenu = new ContextMenuStrip();
     subMenu.Items.Add("Delete");
     subMenu.Items.Add("Rename");  
     ContextMenuStrip.HandleCreated += (s,e) => {
       nativeMenu.AssignHandle(ContextMenuStrip.Handle);
       nativeMenu.ShowContextMenu += (ev) => {
          ev.ContextMenuToShow = subMenu;
       };
     };
  }
  NativeContextMenuStrip nativeMenu = new NativeContextMenuStrip();
}
要获取显示子
ContextMenuStrip
的项目,您可以访问
NativeContextMenuStrip
SourceItem


您可以提供一个特殊的
ToolStripMenuItem
编辑菜单项,以打开对话框编辑菜单的某些部分。
public partial class Form1 : Form {
  public Form1(){
     InitializeComponent();
     //suppose you have a main ContextMenuStrip and a sub ContextMenuStrip
     //try adding some items for both
     ContextMenuStrip = new ContextMenuStrip();
     ContextMenuStrip.Items.Add("Item 1");
     ContextMenuStrip.Items.Add("Item 2");
     //sub ContextMenuStrip
     var subMenu = new ContextMenuStrip();
     subMenu.Items.Add("Delete");
     subMenu.Items.Add("Rename");  
     ContextMenuStrip.HandleCreated += (s,e) => {
       nativeMenu.AssignHandle(ContextMenuStrip.Handle);
       nativeMenu.ShowContextMenu += (ev) => {
          ev.ContextMenuToShow = subMenu;
       };
     };
  }
  NativeContextMenuStrip nativeMenu = new NativeContextMenuStrip();
}