【问题标题】:How do I scroll over items in a Panel?如何滚动面板中的项目?
【发布时间】:2018-04-06 16:14:59
【问题描述】:
我正在创建一个应用,其中有一个面板,其中包含一些标签。
一些标签位于面板的显示矩形之外,因此面板会自动显示一个垂直滚动条(这是我想要的)。
但是,每当我使用鼠标滚轮向下滚动面板时,当其中一个标签在鼠标下向上滚动时,它就会停止滚动。就像焦点从 Panel 变成了 Label 并且 Label 阻止了 Panel 滚动。
我只想使用鼠标滚轮滚动整个面板,无论鼠标下方有什么。
【问题讨论】:
标签:
vb.net
winforms
scroll
panel
【解决方案1】:
面板控件无法获得焦点且不可选择。它只是一个容器。
您可以制作从 Panel 派生的自定义控件并使其能够接收焦点。
这在这种情况下很有帮助,因为这允许在没有任何其他逻辑的情况下滚动自定义面板。
即使另一个通常可以获得焦点的控件(例如 TextBox)挡住了路。
此实现修改了 Panel 控件Style (ControlStyles.Selectable) 以使其能够接受焦点(TabStop 属性也设置为 True)。
OnMouseDown 也被覆盖,因此,如果 Panel 内的控件窃取了焦点,您只需单击 Panel 将焦点移动到它上面,然后滚动它。
Class PanelWithFocus
Inherits System.Windows.Forms.Panel
Public Sub New()
Me.SetStyle(ControlStyles.Selectable, True)
InitializeComponent()
End Sub
Protected Overrides Sub OnEnter(e As EventArgs)
MyBase.OnEnter(e)
Me.Focus()
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
Me.Focus()
MyBase.OnMouseDown(e)
End Sub
Protected Sub InitializeComponent()
Me.AutoScroll = True
Me.BorderStyle = BorderStyle.None
Me.TabStop = True
End Sub
End Class
要在表单中插入此自定义控件,请在工具箱中找到它(在其顶部,查找名为 PanelWithFocus 的控件)并将其拖放到表单上。
如果您想用此面板替换现有面板,请打开您的 Form.Designer 并将 Me.Panel1 = New System.Windows.Forms.Panel() 更改为 Me.Panel1 = New PanelWithFocus()。
Friend WithEvents Panel1 As Panel 也一样,变成Friend WithEvents Panel1 As PanelWithFocus
【解决方案2】:
创建新的面板用户控件
Public Class PanelX
Inherits Panel
Public Sub New()
Me.AutoScroll = True
End Sub
Protected Overrides Sub OnMouseEnter(e As System.EventArgs)
Me.Select()
MyBase.OnMouseEnter(e)
End Sub
End Class
【解决方案3】:
这个我试过了
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
AddHandler MouseWheel, AddressOf Panel1_MouseWheel
End Sub
Private Sub Panel1_MouseWheel(sender As Object, e As MouseEventArgs) Handles Panel1.MouseWheel
Panel1.Focus()
End Sub