How does one control what area of a textbox is visible, without moving the
caret?

In a sense I want to reproduce a scroll bar's behavior. That is, if the
caret is in a particular position, and I move the visible area with a scroll
bar, the caret does not move.

The only way that I have been able to control the visible area of a textbox
is by setting the caret position by setting the SelectionStart property and
calling ScrollToCaret() after. This method works but conflicts with what
the user is doing (erases a highlighted selection for example).

Any ideas?