WPF RichTextBox滚动到TextPointer

时间:2011-08-02 08:08:05

标签: c# wpf scroll richtextbox

WPF RichtTextBox有一个滚动方法:

RichTextBox.ScrollToVerticalOffset(double)

我想以这样的方式滚动,即cerctain范围或至少它的开始进入视野。如何以有意义的方式将TextPointer转换为double?

4 个答案:

答案 0 :(得分:5)

查看FrameworkElement.BringIntoView方法。我正在使用这样的东西:

public void Foo(FlowDocumentScrollViewer viewer) {
    TextPointer t = viewer.Selection.Start;
    FrameworkContentElement e = t.Parent as FrameworkContentElement;
    if (e != null)
         e.BringIntoView();
}

答案 1 :(得分:2)

使用GetCharacterRect获取RichTextBox中TextPointer的位置:

Rect r = textPointer.GetCharacterRect(LogicalDirection.Backward);
rtb.ScrollToVerticalOffset(r.Y);

答案 2 :(得分:0)

因此,如果您想知道为什么BringIntoView()无法正常工作或者滚动到文本框的顶部,那么很可能是因为您试图将其引入视图"包含整个可滚动文本内容的Inline - 它带来查看"这个内联,从(你猜对了)开始"开始" TextPosition位于顶部。

解决方案是每Miroslav's answer使用ScrollToVerticalOffset()

答案 3 :(得分:0)

我有些迟了,但这是一个更完整的答案。当前滚动偏移量需要与字符位置结合在一起。这是一个将RichTextBox文本指针滚动到视图中心的示例:

var characterRect = textPointer.GetCharacterRect(LogicalDirection.Forward);
RichTextBox.ScrollToHorizontalOffset(RichTextBox.HorizontalOffset + characterRect.Left - RichTextBox.ActualWidth / 2d);
RichTextBox.ScrollToVerticalOffset(RichTextBox.VerticalOffset + characterRect.Top - RichTextBox.ActualHeight / 2d);

您不需要检查负数,因为滚动显示了这一点。