Выбрать все экземпляры выделенного слова в AvalonEdit

Я хочу выделить все экземпляры выделенного (выделенного) текста в AvalonEdit. VS2010 делает это, и это удобная функция. Я понимаю, что мне нужно реализовать DocumentColorizingTransformer в соответствии с приведенным ниже кодом, но я не знаю, как получить выделенный текст из документа. Информация о выборе недоступна в «CurrentContext».

Приведенный ниже код находит все экземпляры «AvalonEdit». Как найти все экземпляры выделенного (выделенного) текста.

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
}   }   }

person paligap    schedule 14.07.2013    source источник


Ответы (1)


Текущий выбор текста доступен в TextEditor, поэтому вы можете использовать его в своем классе ColorizeAvalonEdit.

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
        }
    }
}

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

    textEditor.TextArea.TextView.LineTransformers.Add(new ColorizeAvalonEdit(textEditor));
    textEditor.TextArea.SelectionChanged += textEditor_TextArea_SelectionChanged;

    void textEditor_TextArea_SelectionChanged(object sender, EventArgs e)
    {
        this.textEditor.TextArea.TextView.Redraw();
    }
person Matt Ward    schedule 15.07.2013
comment
Текущий выбор текста доступен в TextEditor, поэтому вы можете использовать его в своем классе ColorizeAvalonEdit. Это большая часть этого вопроса. Как вы можете получить доступ к textEditor из CurrentContext. Его там вроде нет? - person paligap; 16.07.2013
comment
Правильно, он недоступен в CurrentContext, поэтому вам придется получить его откуда-то еще. Глядя на исходный код SharpDevelop, кажется, что если текстовый редактор нужен для пользовательского раскрашивающего преобразователя, он передается в преобразователь при его создании. - person Matt Ward; 16.07.2013
comment
Если вам не нравится передавать TextEditor в конструктор, вы можете вместо этого добавить его в TextView, поскольку он реализует интерфейс IServiceProvider. TextView доступен в CurrentContext. - person Matt Ward; 16.07.2013