AvalonEdit WPF TextEditor (SharpDevelop): Как выделить определенный диапазон текста? - PullRequest
4 голосов
/ 17 февраля 2011

Невероятно удивительный элемент управления AvalonEdit WPF TextEditor, кажется, лишен важной функции, или, по крайней мере, я не могу понять это. Учитывая смещение и длину, выделите эту часть в TextDocument с помощью HighlightColor .Просто, верно?

Очевидно, нет.У меня RTFM, и документация по «Подсветке синтаксиса» смутила меня еще больше. Кто-то еще задавал тот же вопрос на форумах SharpDevelop , и я боюсь, что не могу понять ответ г-на Грюнвальда.

Вот моя попытка с использованием класса DocumentHighlighter (конечноэто не работает):

    textEditor1.Text = "1234567890";

    HighlightingColor c = new HighlightingColor() { FontWeight = FontWeights.ExtraBold };

    DocumentHighlighter dh = new DocumentHighlighter(textEditor1.Document, new HighlightingRuleSet());
    HighlightedLine hl = dh.HighlightLine(1);

    hl.Sections.Add(new HighlightedSection() { Color = c, Offset = 1, Length = 3 });

Спасибо за помощь!

Ответы [ 4 ]

7 голосов
/ 17 февраля 2011

Некоторая справочная информация: AvalonEdit - это редактор кода, а не текстовый редактор.Не существует такой вещи, как «выделение части документа» - документ хранит только простой текст.

Подсветка вычисляется по требованию, только для строк, которые в данный момент просматриваются.Если вы хотите пользовательское выделение, вам нужно добавить шаг к вычислению выделения - это то, что делает класс ColorizeAvalonEdit в примере, опубликованном mzabsky.

5 голосов
/ 17 февраля 2011

Вы видели это в этой статье - похоже, именно то, что вы просите:

public class ColorizeAvalonEdit : DocumentColorizingTransformer
{
protected override void ColorizeLine(DocumentLine line)
{
    int lineStartOffset = line.Offset;
    string text = CurrentContext.Document.GetText(line);
    int start = 0;
    int index;
    while ((index = text.IndexOf("AvalonEdit", start)) >= 0) {
        base.ChangeLinePart(
            lineStartOffset + index, // startOffset
            lineStartOffset + index + 10, // endOffset
            (VisualLineElement element) => {
                // This lambda gets called once for every VisualLineElement
                // between the specified offsets.
                Typeface tf = element.TextRunProperties.Typeface;
                // Replace the typeface with a modified version of
                // the same typeface
                element.TextRunProperties.SetTypeface(new Typeface(
                    tf.FontFamily,
                    FontStyles.Italic,
                    FontWeights.Bold,
                    tf.Stretch
                ));
            });
        start = index + 1; // search for next occurrence
}   }   }

Выделено слово AvalonEdit жирным шрифтом.

4 голосов
/ 05 октября 2012

Для этого вам нужно создать собственный ColorizingTransformer. Приведенный выше пример фактически выделяет конкретное слово. Тем не менее, вы можете немного изменить его, чтобы раскрасить или выделить часть.

Я использовал Avalon TextEditor для моего проекта Console + (который сейчас находится на очень примитивной стадии)

public class OffsetColorizer : DocumentColorizingTransformer
{
    public int StartOffset { get; set; }
    public int EndOffset { get; set; }

    protected override void ColorizeLine(DocumentLine line)
    {
        if (line.Length == 0)
            return;

        if (line.Offset < StartOffset || line.Offset > EndOffset)
            return;

        int start = line.Offset > StartOffset ? line.Offset : StartOffset;
        int end = EndOffset > line.EndOffset ? line.EndOffset : EndOffset;

        ChangeLinePart(start, end, element => element.TextRunProperties.SetForegroundBrush(Brushes.Red));
    }
}

И вы можете добавить цветовой редактор в редактор, добавив его в коллекцию LineTransformers.

tbxConsole.TextArea.TextView.LineTransformers.Add(_offsetColorizer);
1 голос
/ 15 июня 2016

Я знаю, что это довольно старый вопрос, но я подумал, что поделюсь своим решением.Я не уверен, было ли это решение реализовано в AvalonEdit, поскольку на этот вопрос изначально был дан ответ, но я обнаружил, что класс OffsetColorizer на самом деле не выбирает строку: он просто меняет цвет фона строки.выглядит следующим образом:

textEditor.SelectionStart = offset;

textEditor.SelectionLength = length;

Тем не менее, это может быть расширено следующим образом:

public void SelectText(int offset, int length)
{
    //Get the line number based off the offset.
    var line = textEditor.Document.GetLineByOffset(offset);
    var lineNumber = line.LineNumber;

    //Select the text.
    textEditor.SelectionStart = offset;
    textEditor.SelectionLength = length;

    //Scroll the textEditor to the selected line.
    var visualTop = textEditor.TextArea.TextView.GetVisualTopByDocumentLine(lineNumber);
    textEditor.ScrollToVerticalOffset(visualTop); 
}

Я считаю, что это решение работает лучше, а не просто окрашивает линию, оно на самом делевыбирает его: это означает, что его можно скопировать с помощью Ctrl + C.

Надеюсь, это поможет людям в будущем.

...