2016-05-05 94 views
0

這種解決方案似乎是那裏最好的和最普遍接受的 - 但是,如果您滾動到底部並觸摸按鈕後面的實際流量控制(I試圖做到這一點,以便有空的空間讓這個示例測試變得更容易),然後你必須雙擊並按住滾動按鈕才能恢復。重新啓動應用程序將恢復類似手機的滾動功能。我想知道是否有其他人看過這個或想出來 - 用你的應用程序試一下,看看是否也是如此。我修改了上面的代碼片段,以便您可以開始一個新項目,將其複製並粘貼到form1的代碼中,然後運行。智能手機像滾動解決方案問題(vb.net)

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 

回答

0

感謝您的代碼,我做了一些更改以改善行爲。我希望對某人有用。

Dim myMouseDownPoint As Point 
Dim myCurrAutoSMouseDown As Point 

「添加布爾變量真。

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 

「添加MouseUp事件退貨布爾變量真。

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

「設置布爾變量虛假變化時mlocation。

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 

「測試布爾變量來進行點擊事件。

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

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

    Else 
     _ValidateClickEvent = True 
    End If 
End Sub