Developing a Silverlight DeepZoom app, I needed to reimplement MultiScaleImage.ZoomAboutLogicalPoint method in terms of changing ViewportWidth and ViewportOrigin, and this is what code I’ve ended with:
public void ZoomAboutPoint(double newScale, Point scalePoint) { double newViewportWidth = _currentViewportWidth / newScale; Point centerPoint = new Point(scalePoint.X / this.ActualWidth, scalePoint.Y / this.ActualHeight); double aboutLogicalPointFactor = _currentViewportWidth - newViewportWidth; Point newViewportOrigin = new Point( _currentViewportOrigin.X + aboutLogicalPointFactor * centerPoint.X, _currentViewportOrigin.Y + aboutLogicalPointFactor * centerPoint.Y / ControlAspectRatio); ... }
You pass a scale factor (the same as you would for ZoomAboutLogicalPoint) and the scalePoint, which is in coordinate system of your control (for example, retrieved with GetPosition() from a mouse event handler).
UPD.: Added control aspect ration to the last line. Thanks, Benny!