Да, поведение по умолчанию ListBox (или, скорее, ScrollViewer внутри шаблона ListBox по умолчанию) - странно - когда я впервые столкнулся с этим, я подумал, что это должна быть практическая шутка. На самом деле, трудно найти какую-либо документацию по этому поводу, но здесь кратко упоминается здесь :
Событие ManipulationBoundaryFeedback позволяет приложениям или компонентам обеспечивать визуальную обратную связь, когда объект достигает границы. Например, класс Window обрабатывает событие ManipulationBoundaryFeedback, чтобы заставить окно слегка переместиться при обнаружении его края.
Итак, способ обойти это - обработать ManipulationBoundaryFeedback в ListBox и установить для параметра Handled значение true:
<ListBox ManipulationBoundaryFeedback="OnManipulationBoundaryFeedback">
// ...
</ListBox>
Код-за:
private void OnManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
{
e.Handled = true;
}