AvalonEdit прокрутите до строки

У меня много проблем с получением AvalonEdit TextEditor для прокрутки до определенной строки. Поведение ScrollTo() заключается в простой прокрутке до тех пор, пока эта строка не окажется в середине представления. Я пробовал много разных методов, найденных в Интернете, и ТАК, как получение смещения с помощью

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

Но у каждого были свои проблемы. Например, в приведенной выше строке я получал исключения с TextView.VisualLines.


person zaknotzach    schedule 07.09.2016    source источник


Ответы (2)


В конце концов я понял, что, поскольку мой текст имеет одинаковую высоту, я могу просто указать высоту строки * строку #, чтобы получить смещение. Сначала я попытался сделать это, используя (Editor.TextArea.TextView.DocumentHeight / Editor.Document.LineCount), чтобы вычислить высоту строки, но это казалось немного неверным, вероятно, из-за некоторых проблем с плавающей запятой, и чем дальше вы опускались в документе, тем больше не соответствовало действительности. Но, опять же, поскольку мой документ имеет одинаковую высоту, я понял, что могу использовать свойство TextView.DefaultLineHeight, и придумал:

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

Это очень последовательно прокручивается точно в нужное место в документе.

person zaknotzach    schedule 07.09.2016
comment
Это работает для меня, но я должен вычесть 1 из номера строки. Кроме того, я думаю, что для пользователя удобнее установить смещение каретки на строку, до которой вы прокручивали. - person Jim Foye; 23.09.2016
comment
Это определенно зависит от вашего приложения, но мне нравится идея каретки. В моем случае, однако, у меня было два редактора, которые я хотел несколько синхронизировать (что-то вроде создания плавающих заголовков с данными в текстовом файле), поэтому окно, которое я автоматически прокручивал, было только для чтения и не требовалось вставки. - person zaknotzach; 01.02.2017

Другой способ сделать это — установить позицию каретки, а затем вызвать функцию BringCaretToView(). В F#:

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

Это прокрутит строку, содержащую «смещение», в поле зрения, но не будет прокручивать текст в редакторе, так что эта строка теперь будет первой видимой. Таким образом, какой подход вы выберете, может зависеть от того, хотите ли вы, чтобы целевая линия была вверху или нет.

person Jim Foye    schedule 23.09.2016
comment
Мне нужно было сделать это, не перемещая каретку. Также я обнаружил, что у подобных методов иногда не было строки, которую я хотел, в верхней части экрана, а просто где-то в поле зрения. - person zaknotzach; 27.09.2016