결론부터 말하면, WPF의 버그이다. 같은 SDK를 사용하는 Win Forms에서는 나타나지 않는 현상이다.
문제가 되는 현상은 WPF 프로그램의 ScrollViewer를 사용하는 UI Element에서 PTP 드라이버를 사용하는 터치패드(요즘 나오는 랩탑에서는 많이 사용한다)로 스크롤하면 스크롤 속도가 말도 안되게 빨라지는 현상이다. 거의 스크롤 거리에 비해 10~20배는 빠르다.
이를 수정하려면 ScrollViewer의 PreviewMouseWheel 를 설정해야한다.
원리는 간단하다. PreviewMouseWheel에서 EventArgs의 Handled를 true로 설정하면스크롤이 되지 않는다. 이 때 EventArgs의 Delta를 받아와 일정 threshold를 넘지 않게 스크롤 시켜주면 된다.
아마도 오류 자체는 Delta값이 매우 커지는 것과 관련된 것같다. PreviewMouseWheel 이벤트가 과도하게 불리는 것은 아니라는 것이다.
또한, 경험상 threshold 값은 int값 48이 가장 적당했다.
PreviewMouseWheel 이벤트 메소드의 예시 코드는 아래와 같다.
public static void HandleScroll(object sender, MouseWheelEventArgs e) { int threshold = 48; ScrollViewer scrollViewer = (ScrollViewer)sender; double target = scrollViewer.VerticalOffset - Math.Min(Math.Max(e.Delta, -threshold), threshold); scrollViewer.ScrollToVerticalOffset(target); e.Handled = true; }