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);
}