Необычная проблема перетаскивания в C # WinForm - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть PictureBox, который может перетаскивать пользователь. Когда перетаскивание завершено, кажется, что компонент непрерывно перемещается из стороны в сторону, подобно вибрации.

1 Ответ

2 голосов
/ 22 декабря 2011

Ваш код не очень логичен.В нем говорится: если пользователь перетаскивает заметку на один пиксель вниз, заметка устанавливается на один шаг вниз.Если затем мышь перемещать в сторону, примечание перемещается вниз на шаг для каждого пикселя, на который перемещается мышь.

Я бы предложил вернуться к концепции.

  • Сначаларасстояние мыши должно быть определено: delta = e.Y - currentY.
  • Затем вставьте его в сетку: gridDelta = delta / step * step, где step равно 10 в вашем случае.

    delta / step представляет количество тонов, на которые перемещается нота.Поскольку мы используем целые числа, это значение округляется, и у нас есть только целые тона.Если мышь перемещают на 10 (= шаг) пикселей вверх, выбирается следующий более высокий тон.

    delta / step * step необходимо, поскольку расстояние от одного тона до другого равно 10, т. Е. Нота должна отображаться на 10 пикселей выше ее исходного положения, если она перемещена на один тон выше.

  • Затем добавьте gridDelta к this.Top и проверьте, находится ли результат в пределах диапазона.
  • Наконец, сохраните значение в this.Top.

Возможно, числа делают его более понятным: Если пользователь нажимает кнопку мыши в позиции Y = 14, затем перетаскивает ее до 48, а затем отпускает, при последнем вызове OnDrag происходит следующее:

  • delta = 48 - 14 -delta равно 34.
  • gridDelta = 34 / 10 * 10 - 34/10 = 3;3 * 10 * 30 - поэтому gridDelta равно 30.
  • newTop = this.Top + 30
  • Проверьте, находится ли newTop в пределах диапазона, и затем присвойте его this.Top.

Видите ли, тогда заметка находится ровно на 30 пикселей выше ее исходного положения, хотя пользователь перетянул ее на 34 пикселя.

Повторения, подобные тем, которые в вашем коде, часто приводят к ошибкам, и это трудночтобы настроить их, поэтому всегда ищите лучший алгоритм.

...