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