Нет проблем. Обработайте перенаправленное событие DragOver
на уровне ScrollViewer
. Получить позицию. Если он находится ближе к верху границ ScrollViewer, прокрутите вверх. Если он находится в нижней части границ ScrollViewer, прокрутите вниз.
Сама прокрутка выполняется путем вызова scrollViewer.LineUp()
или scrollViewer.LineDown()
.
События DragOver
происходят часто, поэтому сохраняйте значение DateTime.Now
в поле каждый раз, когда вы вызываете LineUp()
или LineDown()
. Прежде чем звонить им снова, проверьте DateTime.Now
и, если прошло недостаточно времени, не звоните LineUp()
или LineDown()
.
Для лучшего контроля скорости прокрутки вы можете использовать scrollViewer.ScrollToVerticalOffset(scrollViewer.ContentVerticalOffset + delta)
вместо scrollViewer.LineUp()
и scrollViewer.LineDown()
.
Вы можете обеспечить лучшее взаимодействие с пользователем, если разрешите более быструю прокрутку, когда будете ближе к верхней или нижней части средства просмотра прокрутки. Это можно сделать, разделив область прокрутки на зоны или рассчитав скорость из положения мыши. В этом случае изменение скорости можно выполнить, вызывая LineUp()/LineDown()
несколько раз, когда он ближе к краю, или увеличивая значение delta
, если вы используете ScrollToVerticalOffset
. Вероятно, вам не следует изменять время (сравнение DateTime.Now) для этой цели, потому что оно будет ненадежным.