AvalonEdit TextView Scroll

Я пытаюсь сделать определенную видимую строку (например, строку 152), которая определена в коде позади, чтобы она стала первой видимой строкой в ​​TextView. Кроме того, я хотел бы, чтобы эта строка была выделена. До сих пор я реализовал следующее решение без недостатка:

textEditor.ScrollTo(myLine, 0); // Setting the current line Visible (e.g. line152) in TextView
int firstLine = textEditor.TextArea.TextView.GetDocumentLineByVisualTop(textEditor.TextArea.TextView.ScrollOffset.Y).LineNumber; // This is actual top visible line of current TextView ((e.g. line130) 

textEditor.ScrollTo(firstLine - myLine, 0); //Which is not working

Для выделения этой строки я нашел функцию Draw(), но не знаю, как ее вызвать:

 public void Draw(TextView textView, DrawingContext drawingContext)
    {
        textView.EnsureVisualLines();
        var line = textEditor.Document.GetLineByOffset(textEditor.CaretOffset);
        var segment = new TextSegment { StartOffset = line.Offset, EndOffset = line.EndOffset };

        foreach (Rect r in BackgroundGeometryBuilder.GetRectsForSegment(textView, segment))
        {
            drawingContext.DrawRoundedRectangle(
                new SolidColorBrush(Color.FromArgb(20, 0xff, 0xff, 0xff)),
                new Pen(new SolidColorBrush(Color.FromArgb(30, 0xff, 0xff, 0xff)), 1),
                new Rect(r.Location, new Size(textView.ActualWidth, r.Height)),
                3, 3
            );
        }
    }

person Jim    schedule 10.11.2013    source источник


Ответы (1)


Для скалинга используйте:

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

Для подсветки создайте новый класс, реализующий интерфейс IBackgroundRenderer. Затем добавьте экземпляр вашего класса в коллекцию textEditor.TextArea.TextView.BackgroundRenderers.

person Daniel    schedule 11.11.2013
comment
Привет, я столкнулся с двумя проблемами. Во-первых, если моя строка близка к концу документа, она не будет прокручиваться вверх. Во-вторых, хотя я смог выделить строку, добавив класс, реализующий интерфейс IBackgroundRenderer, однако, когда я меняю строку, предыдущая по-прежнему выделяется. Знаете ли вы, как удалить предыдущую подсветку. Спасибо - person Jim; 11.11.2013
comment
Я пробовал много вариантов этого метода, но всегда получаю какое-то исключение нулевой ссылки на GetVisualTopByDocumentLine. Я не вижу более конкретной информации, но замечаю, что, хотя в редакторе 3 тыс. строк, TextView.allVisualLines пусто, и когда я пытаюсь посмотреть значение TextView.VisualLines, я получаю ICSharpCode.AvalonEdit.Rendering.VisualLinesInvalidException - person zaknotzach; 08.09.2016