WPF RichTextBox scroll to TextPointer
I'm somewhat late, but here is a more complete answer. The current scroll offsets need to be combined with the character position. Here is an example that scrolls RichTextBox text pointer to the center of the view:
var characterRect = textPointer.GetCharacterRect(LogicalDirection.Forward);
RichTextBox.ScrollToHorizontalOffset(RichTextBox.HorizontalOffset + characterRect.Left - RichTextBox.ActualWidth / 2d);
RichTextBox.ScrollToVerticalOffset(RichTextBox.VerticalOffset + characterRect.Top - RichTextBox.ActualHeight / 2d);
You don't need to check for negative numbers, as the scrolling accounts for this.
So if you're wondering why BringIntoView()
isn't working or it scrolls to the top of your textbox, it's likely because you are attempting to "bring into view" the Inline
that comprises your entire scrollable text content - it "brings to view" this inline, which starts at (you guessed it) the "start" TextPosition
at the top.
Solution is to use ScrollToVerticalOffset()
per Miroslav's answer.
Use GetCharacterRect to get position of TextPointer in RichTextBox:
Rect r = textPointer.GetCharacterRect(LogicalDirection.Backward);
rtb.ScrollToVerticalOffset(r.Y);
Have a look at the FrameworkElement.BringIntoView Method. I'm using something like this:
public void Foo(FlowDocumentScrollViewer viewer) {
TextPointer t = viewer.Selection.Start;
FrameworkContentElement e = t.Parent as FrameworkContentElement;
if (e != null)
e.BringIntoView();
}