【问题标题】:.NET Is it possible to have a contextmenu on an item of a combobox?.NET 是否可以在组合框的项目上有一个上下文菜单?
【发布时间】:2010-01-11 14:24:10
【问题描述】:

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

【问题讨论】:

    标签: c# .net winforms combobox


    【解决方案1】:

    这是可能的,但并不容易。 ComboBox 下拉菜单是动态创建的本机 ListBox。要获得该列表框的句柄,您必须在 DropDown 事件中发送 CB_GETCOMBOBOXINFO 消息。查看我在this thread 中的回答,了解如何执行此操作。

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

    考虑一种不同的方法,您可以使用实际的 ListBox,当用户单击文本框旁边看起来像箭头的字形时,您可以使该列表框可见。

    【讨论】:

    • 我喜欢你的第二种方法!没想到!
    【解决方案2】:

    不容易。组合框展开时不会发送悬停或右键单击事件消息。

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

    如果您的方案允许您这样做,我认为最简单的方法是更改​​为列表框。

    【讨论】:

    • 我认为我的方案不允许这样做。请参阅我在 Martin Harris 的评论。
    【解决方案3】:

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

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

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

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

    或者您可以从 Combo 的上下文菜单中调出一个模态对话框怎么样?在对话框中,您可以有一个用户可以从中选择的列表和一个删除按钮来删除选定的项目。

    【讨论】:

      【解决方案4】:

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

      但有两个警告:

      • 组合框列表将在 列表失去焦点,所以它可能会关闭 显示上下文菜单时 让用户不清楚什么 他们点击了(不是 100% 确定 这个,因为我还没有写 要测试的代码。)

      • 更重要的是,虽然我会争论 这是一个糟糕的 UI 选择,我 想不出任何真实的世界 我用过的应用程序 菜单项上的上下文菜单,所以它 不会很容易被发现 最终用户。加上上下文菜单应该 只是为了快速访问,他们 不应该是唯一的访问方式 功能。你会成为 能够暴露这些功能 通过其他方式以及右键菜单?

      【讨论】:

      • 我认为你是对的。也许我必须寻找另一种解决方案。我有一个与浏览器地址栏类似的组合框。您可以输入新项目或选择现有项目。我想要的是用鼠标右键选择一个现有的然后删除这个。
      • 通过键盘组合执行此操作并不少见。例如,当您要删除的项目突出显示时,您可以通过按 Shift+Delete 来删除 Firefox 中的自动完成条目(在 IE 中它只是删除键 - 我认为)。这真的不利于可发现性(因为我只需要通过 Google 搜索查找它),但至少有先例。
      • 感谢这个想法。实现这一点的最佳方法是什么?
      【解决方案5】:

      您可以通过捕获表单上的事件来手动执行此操作,但请考虑制作一个嵌套菜单。如果您的组合框项目有自己的菜单,那么组合框可能不是正确的选择。

      【讨论】:

        【解决方案6】:

        对于那些问“为什么?”的人或者说他们从未见过带有上下文菜单的组合框;查看任何网络浏览器的收藏夹下拉菜单。您可以右键单击并删除、编辑或转到当前选项卡、新选项卡或新窗口中的条目。 我也无法显示实际的上下文菜单条,所以我制作了一个带有小无边框形式的菜单并调用:

        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
        

        使用自制的上下文菜单,请务必在每个 sub 以及 me.mouseleave 事件的末尾添加“me.close”。

        【讨论】:

          猜你喜欢
          • 2015-09-30
          • 1970-01-01
          • 2022-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多