智能手机就像滚动解决方案问题(vb.net)

时间:2016-05-05 18:46:40

标签: vb.net scroll touchscreen

这个解决方案似乎是最好的解决方案之一,也是最普遍接受的解决方案 - 但是,如果你滚动到底部并触摸按钮后面的实际flowcontrol(我试图这样做,这样就会有空的空间为了使这个样本测试更容易),你必须双击并按住按钮才能恢复滚动。重新启动应用程序可恢复类似手机的滚动功能。我想知道是否有其他人已经看到这个或想出来 - 尝试与您的应用程序,看看是否也是如此。我修改了上面的代码段,以便您可以启动一个新项目,将其复制并粘贴到form1的代码中,然后点击运行。

 Public Class Form1
        Dim FlowPanel As New FlowLayoutPanel
        Private Function GenerateButton(ByVal pName As String) As Button
            Dim mResult As New Button
            With mResult
                .Name = pName
                .Text = pName
                .Width = 128
                .Height = 128
                .Margin = New Padding(0)
                .Padding = New Padding(0)
                .BackColor = Color.CornflowerBlue
                AddHandler .MouseDown, AddressOf Button_MouseDown
                AddHandler .MouseMove, AddressOf Button_MouseMove
            End With

            Return mResult
        End Function



        Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

            Me.Width = 806
            Me.Height = 480
            FlowPanel.Padding = New Padding(0)
            FlowPanel.Margin = New Padding(0)
            ' FlowPanel.ColumnCount = Me.Width / (128 + 6)
            FlowPanel.Dock = DockStyle.Fill
            FlowPanel.AutoScroll = True
            Me.Controls.Add(FlowPanel)
            Dim i As Integer
            For i = 1 To 98
                FlowPanel.Controls.Add(GenerateButton("btn" & i.ToString))
            Next
        End Sub

        Dim myMouseDownPoint As Point
        Dim myCurrAutoSMouseDown As Point
        Private Sub Button_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
            myMouseDownPoint = PointToClient(Cursor.Position)
            myCurrAutoSMouseDown = FlowPanel.AutoScrollPosition
        End Sub

        Private Sub Button_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
            If e.Button = Windows.Forms.MouseButtons.Left Then
                Dim mLocation As Point = PointToClient(Cursor.Position)
                If myMouseDownPoint <> mLocation Then
                    Dim mCurrAutoS As Point
                    Dim mDeslocation As Point = myMouseDownPoint - mLocation
                    mCurrAutoS.X = Math.Abs(myCurrAutoSMouseDown.X) + mDeslocation.X
                    mCurrAutoS.Y = Math.Abs(myCurrAutoSMouseDown.Y) + mDeslocation.Y

                    FlowPanel.AutoScrollPosition = mCurrAutoS

                End If
            End If
        End Sub
    End Class

1 个答案:

答案 0 :(得分:0)

感谢代码,我做了一些改进以改善行为。我希望它对某人有用。

Dim myMouseDownPoint As Point
Dim myCurrAutoSMouseDown As Point

&#39;将布尔变量添加为true。

Private _ValidateClickEvent As Boolean = True

Private Sub MyMouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
    myMouseDownPoint = PointToClient(Cursor.Position)
    myCurrAutoSMouseDown = Panel1.AutoScrollPosition
End Sub

<强>&#39;添加MouseUp事件以返回布尔变量为true。

Private Sub MyMouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
    _ValidateClickEvent = True
End Sub

&#39;更改位置时将布尔变量设置为false。

Private Sub MyMouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
    If e.Button = Windows.Forms.MouseButtons.Left Then
        Dim mLocation As Point = PointToClient(Cursor.Position)
        If myMouseDownPoint <> mLocation Then
            Dim mCurrAutoS As Point
            Dim mDeslocation As Point = CType(myMouseDownPoint - mLocation, Size)
            mCurrAutoS.X = Math.Abs(myCurrAutoSMouseDown.X) + mDeslocation.X
            mCurrAutoS.Y = Math.Abs(myCurrAutoSMouseDown.Y) + mDeslocation.Y
            Panel1.AutoScrollPosition = mCurrAutoS

            _ValidateClickEvent = False

        End If
    End If
End Sub

<强>&#39;测试布尔变量以执行点击事件。

Private Sub MyClick(sender As System.Object, e As System.EventArgs)
    If _ValidateClickEvent Then

       ........................

    Else
        _ValidateClickEvent = True
    End If
End Sub