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。
执行此操作后,标准行为将正常运行!
今天我正在寻找一种滚动多行、动态大小的文本框的方法。
我想滚动到插入符号,但在 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。
执行此操作后,标准行为将正常运行!