C# AvaloneEdit滚动至第行
让AvaloneEditC# AvaloneEdit滚动至第行,c#,scroll,avalonedit,C#,Scroll,Avalonedit,让AvaloneEditTextEditor滚动到特定行时,我遇到了很多麻烦。 ScRoToTo()/Case>行为只需滚动,直到该行位于视图的中间。我尝试了许多不同的方法,在互联网上找到的,所以喜欢用 double visualTop = textEditor.TextArea.TextView.GetVisualTopByDocumentLine(line); 但每一个都有自己的问题。例如,在上面的一行中,我得到了TextView.VisualLines的异常,我最终发现,由于我的文本都是
TextEditor
滚动到特定行时,我遇到了很多麻烦。<代码> ScRoToTo()/Case>行为只需滚动,直到该行位于视图的中间。我尝试了许多不同的方法,在互联网上找到的,所以喜欢用
double visualTop = textEditor.TextArea.TextView.GetVisualTopByDocumentLine(line);
但每一个都有自己的问题。例如,在上面的一行中,我得到了
TextView.VisualLines
的异常,我最终发现,由于我的文本都是统一高度的,所以我可以通过行高*行来获得偏移量。我第一次尝试使用(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对我有效,但我必须从行号中减去1。此外,我认为将插入符号偏移量设置为滚动到的行是更好的用户体验。这当然取决于您的应用程序,但我喜欢插入符号的想法。不过,在我的例子中,我有两个编辑器,我想在某种程度上进行同步(有点像在文本文件中创建带有数据的浮动标题),因此我自动滚动的窗口是只读的,不需要插入符号。我需要在不移动插入符号的情况下执行此操作。我还发现,像这样的方法有时在屏幕顶部没有我想要的线条,而只是“在视图”的某个地方。
editor.TextArea.Caret.Offset <- offset
editor.TextArea.Caret.BringCaretToView()