【发布时间】: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