Выбранное форматирование текста в WPF RichTexBox - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь реализовать программно выбранный (используя регулярное выражение) форматирование текста в WPF RichTextBox. Вариант использования - это просто WPF RichTextBox, в котором пользователь печатает текст. Тем не менее, чтобы улучшить или ускорить читаемость, я хочу включить некоторые автоматические c форматирования при наборе текста.

Следующий код из Как выбрать текст из RichTextBox и затем раскрасить его? это именно то, что я пытаюсь сделать. Однако, насколько я могу судить, этот код предназначен для WinForms RichTextBox:

public void ColourRrbText(RichTextBox rtb)
{
    Regex regExp = new Regex(@"\b(For|Next|If|Then)\b");

    foreach (Match match in regExp.Matches(rtb.Text))
    {
        rtb.Select(match.Index, match.Length);
        rtb.SelectionColor = Color.Blue;
    }
}

Я попытался преобразовать его следующим образом:

public static void ColorSpecificText(RichTextBox rtb)
{
    TextRange textRange = new TextRange(rtb.Document.ContentEnd, rtb.Document.ContentEnd);

    Regex regex = new Regex(@"\b(For|Next|If|Then)\b");

    foreach (Match match in regex.Matches(textRange.Text))
    { 
        textRange.Select(match.Index, match.Length); // <--- DOESN'T WORK
        textRange.SelectionColor = Color.Blue; // <--- DOESN'T WORK
    }
}

Однако я застрял на том, как преобразовать синтаксис «match.Index, match.Length» и «SelectionColor» во что-то, что WPF RichTextBox знает, как обрабатывать. Я искал другие сообщения, но большинство также, кажется, для WinForms RichTextBox, а не WPF. Любое руководство будет с благодарностью.

1 Ответ

1 голос
/ 16 апреля 2020

Это синтаксис:

TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Black);
Regex regex = new Regex(@"\b(For|Next|If|Then)\b");

int i = 0;
foreach (Match match in regex.Matches(textRange.Text))
{
    var wordStartOffset = textRange.Start.GetPositionAtOffset(i + match.Index);
    var wordEndOffset = textRange.Start.GetPositionAtOffset(i + match.Index + match.Length);
    var wordRange = new TextRange(wordStartOffset, wordEndOffset);
    wordRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.LightBlue);
    i += 4; // could be something else
}

Хотя он может выделяться неправильно из-за вашей стратегии. Боюсь, что строкового индекса недостаточно для создания правильного TextPointer. +4 используется для пропуска накладных расходов на форматирование, поэтому может не работать, если присутствуют другие форматирования.

...