Thank you so much, Lyubo.

But redRect is the imageNode I want to limit. If I change redRect to imageBounds. You cannot zoom in or out after the program is running. Is it because I have two nodes: imageNode and overlayNode?
private void diagram_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
var imageBounds = imageNode.Bounds;
var zoomRect = diagram.Viewport;
var zoomStep = 10;
if (e.Delta < 0)
{
zoomRect = new Rect
(
Math.Max(imageBounds.X, zoomRect.X - zoomStep / 2),
Math.Max(imageBounds.Y, zoomRect.Y - zoomStep / 2),
Math.Min(imageBounds.Width, zoomRect.Width + zoomStep),
Math.Min(imageBounds.Height, zoomRect.Height + zoomStep)
);
}
else
{
zoomRect = new Rect
(
Math.Min(imageBounds.X, zoomRect.X + zoomStep / 2),
Math.Min(imageBounds.Y, zoomRect.Y + zoomStep / 2),
Math.Max(imageBounds.Width, zoomRect.Width - zoomStep),
Math.Max(imageBounds.Height, zoomRect.Height - zoomStep)
);
}
diagram.ZoomToRect(zoomRect, true);
// stop the scrollviewer from scrolling
e.Handled = true;
}