AvalonEdit滚动到行

本文关键字:滚动 AvalonEdit | 更新日期: 2023-09-27 18:06:03

我有很多麻烦得到一个AvalonEdit TextEditor滚动到一个特定的行。ScrollTo()的行为只是滚动,直到该行位于视图的中间。我已经尝试了许多不同的方法在互联网上找到,所以像得到偏移量与

double visualTop = textEditor.TextArea.TextView.GetVisualTopByDocumentLine(line);

但是每个都有自己的问题。例如,在上面的行中,我得到了TextView.VisualLines的异常。

AvalonEdit滚动到行

我最终弄清楚,因为我的文本都是统一的高度,我可以用line height * line#来获得偏移量。我首先尝试使用(Editor.TextArea.TextView.DocumentHeight / Editor.Document.LineCount)来计算行高度,但这似乎有点偏离,可能是由于一些浮点问题,并且在文档中走得越远,就越偏离。但是,由于我的文档是统一高度,我意识到我可以使用TextView.DefaultLineHeight属性,并提出:

double vertOffset = (Editor.TextArea.TextView.DefaultLineHeight) * Line;
Editor.ScrollToVerticalOffset(vertOffset);

这非常一致地滚动到文档中的正确位置

另一种方法是设置插入符号的位置,然后调用BringCaretToView()。在f#:

editor.TextArea.Caret.Offset <- offset
editor.TextArea.Caret.BringCaretToView()

这将滚动包含'offset'的行到视图中,但它不会滚动编辑器中的文本,使这一行现在是第一个可见的。因此,您采用哪种方法可能取决于您是否希望目标行位于顶部。

我这样做是为了使所需的行垂直居中:

  var lineHeight  = editor.TextArea.TextView.DefaultLineHeight;
  var visualLines = editor.TextArea.TextView.VisualLines.Count;
  var vertOffset  = lineHeight * (DESIRED_LINE - (visualLines/2));
  editor.ScrollToVerticalOffset(vertOffset);