Прежде всего, если у вас есть PictureBox внутри вашей панели, то вам не нужно учитывать местоположение панели, так как местоположение PictureBox будет обнулено в верхнем левом углу Панель.
Это условие:
If PictureBox.Location.X <= Panel1.Location.X ...
следует изменить на это условие:
If PictureBox.Location.X <= 0
1011 *
*
Кроме того, проблема, с которой вы сталкиваетесь, связана с тем, что ваш обработчик событий переключается между перемещением PictureBox с 0,0 на перемещение PictureBox в местоположение дельты.
Например:
Когда вы перетаскиваете PictureBox вправо так, что его левая граница проходит за левую границу Panel (т.е. PictureBox.Location.X> 0), тогда условие вашего оператора if оценивается как False, а расположение PictureBox устанавливается в 0. Однако так как вы теперь изменили его местоположение, событие MouseMove запускается снова, и на этот раз условие вашего оператора if оценивается как True, а местоположение PictureBox устанавливается на местоположение дельты.
Снова вызывается событие MouseMove, и сценарий повторяется, переворачивая местоположение PictureBox вперед и назад, вызывая эффект дрожания.
Это можно исправить, изменив свое состояние, чтобы полагаться на новое местоположение PictureBox вместо текущего:
Это условие:
If PictureBox.Location.X <= 0 ...
следует изменить на это условие:
If (PictureBox.Location.X + deltaX) <= 0 ...
Это устраняет проблему дрожания, но ваш код заботится только о том случае, когда PictureBox перетаскивается вправо и вниз.
Вместо того, чтобы писать больше условий, вы могли бы упростить свой код, переместив вычисления в отдельную функцию, которая обрабатывает каждую ось отдельно:
If (mouse.Button = Windows.Forms.MouseButtons.Left) Then
Dim mousePosNow As Point = mouse.Location
Dim deltaX As Integer = mousePosNow.X - mouseDowns.X
Dim deltaY As Integer = mousePosNow.Y - mouseDowns.Y
Dim newX As Integer = Clamp(PictureBox1.Location.X + deltaX, PictureBox1.Width, Panel1.Width)
Dim newY As Integer = Clamp(PictureBox1.Location.Y + deltaY, PictureBox1.Height, Panel1.Height)
PictureBox1.Location = New Point(newX, newY)
End If
...
Private Function Clamp(val As Integer, outerBound As Integer, innerBound As Integer) As Integer
Dim newVal As Integer = val
If newVal > 0 Then
newVal = 0
End If
If newVal + outerBound < innerBound Then
newVal = innerBound - outerBound
End If
Return newVal
End Function