If your using WPF I would do the following:
<Viewbox>
<Grid>
<Image x:Name="MainImage" />
</Grid>
</Viewbox>
then in your code create:
ScaleTransform _imageScaleTransform = new ScaleTransform();
// build transform group and add to main image
var transformGroup = new TransformGroup();
transformGroup.Children.Add(_imageScaleTransform);
MainImage.RenderTransform = transformGroup;
MainImage.RenderTransformOrigin = new Point(0.5, 0.5);
then you can make the zoom happen on mouse events
private void OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs mouseButtonEventArgs)
{
if (MainImage.IsMouseDirectlyOver)
{
_rightButtonMouseCaptured = true;
((UIElement) sender).CaptureMouse();
_rightButtonScreenPosition = mouseButtonEventArgs.GetPosition(this);
}
}
private void OnMouseMove(object sender, MouseEventArgs mouseEventArgs)
{
#region Magnify
if (_rightButtonMouseCaptured)
{
var currentPositionRight = mouseEventArgs.GetPosition(this);
var rightDelta = currentPositionRight.Y - _rightButtonScreenPosition.Y;
if (rightDelta > 1)
{
_imageScaleTransform.ScaleX *= 1.1;
_imageScaleTransform.ScaleY *= 1.1;
}
else if (rightDelta <= -1)
{
_imageScaleTransform.ScaleX /= 1.1;
_imageScaleTransform.ScaleY /= 1.1;
}
_rightButtonScreenPosition = currentPositionRight;
return;
}
}
then to pan the zoomed in image you could use the use a Translate transform, add it to the same transform group some additional events and hey presto