2016-05-05 16 views
0

Diese Lösung scheint die beste zu sein und die am häufigsten akzeptierte - aber, wenn Sie nach unten scrollen und berühren Sie die tatsächliche Flowcontrol hinter den Tasten (I versuchte dies so zu machen, dass es Platz für diesen Beispieltest geben würde), dann musst du den Knopf für das Scrollen doppelt antippen und halten, um fortzufahren. Durch den Neustart der Anwendung wird die telefonähnliche Bildlauffunktion wiederhergestellt. Ich frage mich, ob jemand anderes dies gesehen hat oder es herausgefunden hat - probiere es mit deinen Apps aus und schau, ob es auch so ist. Ich habe das obige Snippet so modifiziert, dass Sie ein neues Projekt starten können, kopieren Sie es und fügen Sie es in den Code von form1 ein und drücken Sie run.Smart Phone Like Scrolling Lösungsproblem (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 

Antwort

0

Dank für den Code, habe ich einige Änderungen vorgenommen, um das Verhalten zu verbessern. Ich hoffe, dass es für jemanden nützlich sein kann.

Dim myMouseDownPoint As Point 
Dim myCurrAutoSMouseDown As Point 

‚hinzufügen boolean Variable, die einen wahren.

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 

'Add MouseUp Ereignis für die Rückkehr der Boolesche Variable, die einen wahren.

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

‚Set boolean Variable a falsch, wenn Änderung 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 

'Test boolean Variable click-Ereignis auszuführen.

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

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

    Else 
     _ValidateClickEvent = True 
    End If 
End Sub