/// <summary>
 /// Applies the computed scale to the image control.
 /// </summary>
 private static void ApplyScale(Image image, ImageZoomerSettings settings)
 {
     ((CompositeTransform)image.RenderTransform).ScaleX = settings.TotalImageScale;
      ((CompositeTransform)image.RenderTransform).ScaleY = settings.TotalImageScale;
 }
        /// <summary>
        /// Checks that dragging by the given amount won't result in empty space around the image
        /// </summary>
        private static bool IsDragValid(double scaleDelta, Point translateDelta, Image image, ImageZoomerSettings settings, out bool bounce)
        {
            if (settings.ImagePosition.X + translateDelta.X < image.ActualWidth * 0.33 || settings.ImagePosition.Y + translateDelta.Y < image.ActualHeight * 0.33)
             {
            bounce = true;
            return true;
             }
             if ((image.ActualWidth * settings.TotalImageScale * scaleDelta) + (settings.ImagePosition.X + translateDelta.X) < image.ActualWidth * 1.33)
             {
            bounce = true;
            return true;
             }
             if ((image.ActualHeight * settings.TotalImageScale * scaleDelta) + (settings.ImagePosition.Y + translateDelta.Y) < image.ActualHeight * 1.33)
             {
            bounce = true;
            return true;
             }

             if ((image.ActualWidth * settings.TotalImageScale * scaleDelta) + (settings.ImagePosition.X + translateDelta.X) < image.ActualWidth)
             {
            bounce = false;
            return false;
             }
             if ((image.ActualHeight * settings.TotalImageScale * scaleDelta) + (settings.ImagePosition.Y + translateDelta.Y) < image.ActualHeight)
             {
            bounce = false;
            return false;
             }

             bounce = false;
             return true;
        }
 private static void ApplyPosition(Image image, ImageZoomerSettings settings)
 {
     ((CompositeTransform)image.RenderTransform).TranslateX = settings.ImagePosition.X;
      ((CompositeTransform)image.RenderTransform).TranslateY = settings.ImagePosition.Y;
 }
 /// <summary>
 /// Updates the scaling factor by multiplying the delta.
 /// </summary>
 private static void UpdateImageScale(double scaleFactor, Image image, ImageZoomerSettings settings)
 {
     settings.TotalImageScale *= scaleFactor;
      ApplyScale(image, settings);
 }
        private static void UpdateImagePosition(Point delta, Image image, ImageZoomerSettings settings)
        {
            var newPosition = new Point(settings.ImagePosition.X + delta.X, settings.ImagePosition.Y + delta.Y);

             if (newPosition.X > 0) newPosition.X = 0;
             if (newPosition.Y > 0) newPosition.Y = 0;

             if ((image.ActualWidth * settings.TotalImageScale) + newPosition.X < image.ActualWidth)
            newPosition.X = image.ActualWidth - (image.ActualWidth * settings.TotalImageScale);

             if ((image.ActualHeight * settings.TotalImageScale) + newPosition.Y < image.ActualHeight)
            newPosition.Y = image.ActualHeight - (image.ActualHeight * settings.TotalImageScale);

             settings.ImagePosition = newPosition;

             ApplyPosition(image, settings);
        }
 /// <summary>
 /// Resets the zoom to its original scale and position
 /// </summary>
 private static void ResetImagePosition(Image image, ImageZoomerSettings settings)
 {
     settings.TotalImageScale = 1;
      settings.ImagePosition = new Point(0, 0);
      ApplyScale(image, settings);
      ApplyPosition(image, settings);
 }
 /// <summary>
 /// Tells if the scaling is inside the desired range
 /// </summary>
 private static bool IsScaleValid(double scaleDelta, ImageZoomerSettings settings)
 {
     return (settings.TotalImageScale * scaleDelta >= 1) && (settings.TotalImageScale * scaleDelta <= settings.MAX_IMAGE_ZOOM);
 }