【问题标题】: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
        

        【讨论】:

          猜你喜欢
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-14
          • 2010-09-30
          • 2022-12-06
          • 1970-01-01
          相关资源
          最近更新 更多