【问题标题】:MouseLeave Event Doesn't Trigger After a Click?单击后不会触发 MouseLeave 事件?
【发布时间】:2019-12-16 13:18:02
【问题描述】:

我的 Windows 窗体中有一个简单的问题。我有一个列表框,用作我输入的一些串行数据的日志,并且希望能够使用滚轮在其中移动。为了做到这一点,我有一个变量 hoverList,最初设置为 0,它在列表框的 MouseEnter 事件中变为 1。然后对于 MouseWheel 事件,我增加或减少列表框中的选定索引,但前提是 hoverList 为 1。我希望当鼠标离开列表框上方的区域时,MouseLeave 事件将触发,这会将 hoverList 设置为 0 并停止允许“滚动”。这工作正常,直到我单击列表框;我仍然可以很好地滚动,但现在我可以在屏幕上的任何地方滚动列表框。似乎在列表框内单击不允许触发 MouseLeave 事件。是这样吗?如果是这样,是否有避免此问题的解决方法? 3 个事件的代码如下所示

Private Sub LstSerialData_MouseLeave(sender As Object, e As EventArgs) Handles lstSerialData.MouseLeave
    hoverList = 0
End Sub

Private Sub LstSerialData_MouseEnter(sender As Object, e As EventArgs) Handles lstSerialData.MouseEnter
    hoverList = 1
End Sub

Private Sub Form1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
    If hoverList Then
        If e.Delta > 0 Then
            If lstSerialData.SelectedIndex > 10 Then
                lstSerialData.SelectedIndex -= 10
            Else
                lstSerialData.SelectedIndex = 0
            End If
        Else
            If lstSerialData.SelectedIndex < lstSerialData.Items.Count - 10 Then
                lstSerialData.SelectedIndex += 10
            Else
                lstSerialData.SelectedIndex = lstSerialData.Items.Count - 1
            End If
        End If
    End If
End Sub

【问题讨论】:

  • 不要无故使用数字来表示布尔值。根据您所说的,hoverList 应该是 Boolean 类型并且具有值 True 和 False,而不是 1 和 0。此外,您确实应该为变量使用描述性名称。 hoverList 不是真正的描述性。没有解释,没有人会知道这意味着什么。 isMouseOverListBox 之类的变量名无需进一步解释。在这些 IDE 和 Intellisense 时代,使用简短的、神秘的变量名称是一种错误的经济方式。
  • MouseLeave是不是点击后不被提升的情况,你不用问我们。这就是调试器的用途。在此处发布之前,您应该始终已经调试过您的代码。调试确实意味着只运行代码。这意味着设置断点,单步执行代码并在适当的点检查状态。如果您在该 MouseLeave 事件处理程序上放置断点并且它没有被命中,则该事件不会被引发。
  • 关于我关于使用Boolean 变量的第一条评论,您可以按照自己的方式使用数字这一事实表明您拥有Option Strict Off,这本身就是不好的。不幸的是,这是默认设置,但每个人都应该尽快更改。您应该在项目属性和 IDE 选项中设置Option Strict On,因此它是未来项目的默认设置。
  • 我刚刚在 VS 2017 中测试了您的代码,但没有看到您描述的行为。我按照我的建议做了,无论我是否点击了一个项目,我都看到了断点。
  • @jmcilhinney 感谢您提供的所有信息,我已采纳您的建议并将变量类型更改为“布尔”,并设置了“选项严格开启”。我还在“MouseLeave”事件中添加了一个断点,并注意到它每次都会触发。一旦鼠标离开列表框上方的区域,该值就是“假”,但是我仍然有一个问题,在我单击框后,我可以从任何地方滚动它,即使变量为假并且“滚动”动作只发生在“If”语句中,检查悬停变量是否为真。为什么会这样?

标签: vb.net winforms listbox mouseevent mouseover


【解决方案1】:

我已经找到了问题的解决方案。单击列表框时,成为选中控件;因为它有一个滚动条,我实际上可以使用滚轮滚动它。将光标移出列表框会禁用 my 内置滚动,但不会取消选择列表框,这意味着我仍然可以滚动浏览它。我编辑了我的MouseEnter 和MouseLeave 事件以分别选择和取消选择列表框。这意味着只要我的光标离开列表框,无论我是否在其中单击,它都会被取消选择并且不再让我滚动浏览它。这也意味着不再需要我的 ghetto 解决方法来允许滚动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2016-04-25
    • 2012-09-12
    • 2019-06-22
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多