private double startHorizontalOffsetPosition; private double startVerticalOffsetPosition; private void OnPointerPressed(PointerRoutedEventArgs e) { e.Handled = true; var startPosition = e.GetCurrentPoint(AssociatedViewer).Position; startHorizontalOffsetPosition = AssociatedViewer.HorizontalOffset + startPosition.X; startVerticalOffsetPosition = AssociatedViewer.VerticalOffset + startPosition.Y; } private void OnPointerUnpressed(PointerRoutedEventArgs e) { e.Handled = true; } private void OnPointerMoved(PointerRoutedEventArgs e) { e.Handled = true; var position = e.GetCurrentPoint(AssociatedViewer).Position; var offsetX = startHorizontalOffsetPosition - position.X; var offsetY = startVerticalOffsetPosition - position.Y; AssociatedViewer.ChangeView(offsetX, offsetY, null); }