Ваш код не очень логичен.В нем говорится: если пользователь перетаскивает заметку на один пиксель вниз, заметка устанавливается на один шаг вниз.Если затем мышь перемещать в сторону, примечание перемещается вниз на шаг для каждого пикселя, на который перемещается мышь.
Я бы предложил вернуться к концепции.
- Сначаларасстояние мыши должно быть определено:
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 пикселя.
Повторения, подобные тем, которые в вашем коде, часто приводят к ошибкам, и это трудночтобы настроить их, поэтому всегда ищите лучший алгоритм.