private void scrollViewerPreviewMouseWheel(object sender, MouseWheelEventArgs e) { System.Windows.Point mouseAtImage = e.GetPosition(viewport); System.Windows.Point mouseAtScrollViewer = e.GetPosition(scrollViewer); ScaleTransform st = viewport.LayoutTransform as ScaleTransform; if (st == null) { st = new ScaleTransform(); viewport.LayoutTransform = st; } if (e.Delta > 0) { st.ScaleX = st.ScaleY = st.ScaleX * 1.25; if (st.ScaleX > 64) { st.ScaleX = st.ScaleY = 64; } } else { st.ScaleX = st.ScaleY = st.ScaleX / 1.25; if (st.ScaleX < 1) { st.ScaleX = st.ScaleY = 1; } } #region [this step is critical for offset] scrollViewer.ScrollToHorizontalOffset(0); scrollViewer.ScrollToVerticalOffset(0); window.UpdateLayout(); #endregion Vector offset = viewport.TranslatePoint(mouseAtImage, scrollViewer) - mouseAtScrollViewer; scrollViewer.ScrollToHorizontalOffset(offset.X); scrollViewer.ScrollToVerticalOffset(offset.Y); window.UpdateLayout(); e.Handled = true; }