2016-05-05 6 views
0

Это решение кажется лучшим из них и наиболее распространенным - однако, если вы прокрутите страницу вниз и коснитесь фактического управления потоком за кнопками (I попытался сделать это так, чтобы было пустое пространство, чтобы облегчить этот образец теста), вам нужно дважды нажать и удерживать кнопку для возобновления прокрутки. Перезапуск приложения восстанавливает функциональность прокрутки телефона. Мне интересно, видел ли кто-нибудь еще это или понял это - попробуйте его со своими приложениями и посмотрите, так ли это. Я изменил фрагмент выше, чтобы вы могли начать новый проект, скопировать и вставить его в код формы1 и нажать «Бег».Смартфон как прокрутка Решение проблемы (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 

«Set булева переменная ложная, когда изменение 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 булева переменная для выполнения события щелчка.

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

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

    Else 
     _ValidateClickEvent = True 
    End If 
End Sub