.NET是否可以在combobox的项目上设置上下文菜单?

在我的应用程序中,我有几个项目的下拉列表。 当用户在下拉项目上单击鼠标右键时,我想显示上下文菜单。 这可能吗? 如果有可能,怎么样?

由于MenuItem没有ContextMenu属性,因此它不像许多其他控件那么容易。 您可能需要捕获右键单击事件,然后手动定位并显示上下文菜单。

但有两点需要注意:

  • 当列表失去焦点时,combobox列表将关闭,因此当显示上下文菜单时它可能会关闭,使用户不清楚他们点击了什么(不是100%肯定,因为我没有编写代码来测试。 )

  • 更重要的是,尽管我认为这是一个糟糕的UI选择,但我想不出任何我在菜单项上都有上下文菜单的真实世界应用程序,因此最终用户不会发现它。 加上下文菜单应该只是为了快速访问,它们不应该是访问function的唯一方法。 您是否能够通过其他方式以及右键单击菜单公开这些function?

这是有可能的,但并不容易。 ComboBox下拉列表是一个即时创建的本机ListBox。 要获取该列表框的句柄,您必须在DropDown事件中发送CB_GETCOMBOBOXINFO消息。 在此主题中查看我的答案,了解如何执行此操作。

泰坦尼克号可能会沉没的冰山是,一旦失去焦点,下拉就会自动关闭。 只要显示上下文菜单,就会发生这种情况。 你无能为力。

考虑一种不同的方法,您可以使用实际的ListBox,当用户单击TextBox旁边的箭头时,您可以看到它。

不容易。 扩展combobox时,不会发送hover或右键单击事件消息。

使用Spy ++时可以看到这种情况。

我认为最简单的方法是在您的方案允许的情况下更改为列表框。

正如Wim在他的post中所说,没有直接的方法可以做到这一点,因为你想要的消息不会被解雇。

作为一个包含,您可以尝试设置DropdownStyle=Simple; 在组合上并缩小滚动区域以显示单行:

http://img34.imageshack.us/img34/1695/49557147.jpg

如果为Combo分配上下文菜单,则在右键单击滚动区域时将打开该菜单。 您可能必须弄清楚右键单击了哪个项目。 但正如其他人所说,这听起来不像标准的Windows方式或直观的用途。

或者你可以从Combo的上下文菜单中找到一个modal dialog怎么样? 在对话框中,您可以有一个用户可以从中选择的列表和一个删除按钮来删除所选项目。

您可以通过捕获表单上的事件手动完成,但考虑使用嵌套菜单。 如果您的combobox项目有自己的菜单,那么combobox可能不是正确的选择。

对于那些问“为什么?”的人 或者说他们从未见过带有情境组合的combobox; 查看任何Web浏览器的collections夹下拉列表。 您可以右键单击并删除,编辑或转到当前选项卡,新选项卡或新窗口中的条目。 我也无法获得一个真实的上下文显示,所以我创建了一个带有无边框forms的菜单,并调用:

 Private Sub FavoritesBar_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles FavoritesBar.SelectedIndexChanged FavIndex = FavoritesBar.SelectedIndex 'FavIndex is declared as a public string. Dim Loc As Point = New Point(MousePosition) FavMenu.Location = Loc FavMenu.ShowDialog() End Sub 

使用自制的contextmenu,一定要在每个sub的末尾添加“me.close”以及me.mouseleave事件。