WPF 将多行文本框滚动到插入位置

WPF scroll multiline textbox to caret position

今天我正在寻找一种滚动多行、动态大小的文本框的方法。

我想滚动到插入符号,但在 Internet 上找不到任何有用的信息。

在尝试了很多事情之后,我知道如何滚动到一行的末尾,但不知道如何滚动到插入符号。 向右滚动已经实现了,但是水平滚动部分已经没有了。

 private void txtText_PreviewKeyDown(object sender, KeyEventArgs e)
 {
        if (e.Key == Key.Down || e.Key == Key.Up)
        {
            var CurrentLineIndex = txtText.GetLineIndexFromCharacterIndex(((TextBox)sender).SelectionStart);
            txtText.ScrollToLine(CurrentLineIndex);
        }
       
 }

这是我当前的代码,它会为我滚动到正确的行。

尝试为水平滚动做一些类似的事情:

var rect = ((TextBox)sender).GetRectFromCharacterIndex(((TextBox)sender).CaretIndex);
txtText.ScrollToHorizontalOffset(Math.Max((txtText.HorizontalOffset + rect.Right - (txtText.ActualWidth - 40)), 0.0));

但它没有像预期的那样工作,它没有滚动到水平插入符号位置。

想想,我必须描述得更好:

如果我用向左或向右箭头移动插入符号,它无需执行任何操作即可正常工作。

如果我这样做是行不通的:

从一行移到另一行。 有时其中一行比另一行长或短,在这种情况下我不得不滚动到插入符号位置。

示例:

第 1 行比第 2 行长

我使用键盘上的“end”键导航到第 1 行的末尾。

然后我导航到第 2 行。

一切正常,插入符号跳到第 2 行的末尾,它会自动滚动到可见区域。

但是如果我从第 2 行返回到第 1 行,插入符号就位于第 1 行的末尾。但它不会滚动到第 1 行的末尾。

问题是我使用了 Style 模板而忘记了一个必要的东西:

通过

 ContentTemplate="{TemplateBinding ContentTemplate}" CanContentScroll="{TemplateBinding CanContentScroll}" 

到 ScrollContentPresenter。

执行此操作后,标准行为将正常运行!