如何滚动面板中的项目

时间:2018-04-06 16:14:59

标签: vb.net scroll panel

我正在vb.net中创建一个winforms应用程序,我有一个带有一些标签的面板。标签越过面板的底部,因此面板会自动显示一个垂直滚动条(这就是我想要的)。但是,每当我使用鼠标滚轮向下滚动面板时,当其中一个标签在鼠标下向上滚动时,它会停止滚动。这就像焦点从面板变为标签,标签不需要滚动。我想使用鼠标滚轮滚动整个面板,无论鼠标是什么。

3 个答案:

答案 0 :(得分:1)

Panel控件无法具有焦点且无法选择。它只是一个容器。

您可以创建一个从Panel派生的自定义控件,并使其能够接收焦点 这在这种情况下有很大帮助,因为这样可以在没有任何其他逻辑的情况下滚动自定义面板 即使另一个通常可以获得焦点的控件(如TextBox)也会受到影响。

此实现修改了Panel控件StyleControlStyles.Selectable)以使其能够接受Focus(TabStop属性也设置为True)。

OnMouseDown也被覆盖,因此,如果Panel中的控件窃取了Focus,您只需要单击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的控件)并将其放在表单上。

如果您想用现有的Panel替换现有的Panel,请打开Form.Designer并使用Me.Panel1 = New System.Windows.Forms.Panel()更改Me.Panel1 = New PanelWithFocus()

Friend WithEvents Panel1 As Panel成为Friend WithEvents Panel1 As PanelWithFocus

的情况相同

答案 1 :(得分:0)

创建新的面板用户控件

  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

答案 2 :(得分:0)

尝试了这个对我好的工作

    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