У меня неправильное представление о FlowDocument, пожалуйста, помогите мне разобраться.Я работаю над редактором исходного кода, где пользователь может добавить несколько специальных переменных, а затем программа ищет эти переменные.Для этого редактора я использую RichTextBox (RTB).Я хотел бы использовать цвет для этих переменных.Это не было проблемой, чтобы добавить цвет, когда пользователь добавляет новую переменную в текст.Но когда пользователь сначала открывает исходный код, в котором уже есть некоторые переменные, мне нужно пройтись по всему тексту и раскрасить переменные.
Код ниже: сначала я ищу все переменные и их положение с помощью регулярных выражений. (Переменные выглядят так: <* variable *>) Затем циклично проходит и меняет цвет один за другим, но когдаЯ делаю TextRange, GetPositionAtOffset возвращает неправильное значение.Я знаю, что это из-за специальных символов форматирования, которые также считаются с помощью GetPositionAtOffset.Вопрос в том, как я могу решить эту проблему?
private void ColorizeAllVariable(TextRange TR_Input)
{
Regex regex = new Regex(@"(<\*.[^<\*>]*\*>)");
MatchCollection matches = regex.Matches(TR_Input.Text);
NoRTBChangeEvent = true;
for (int i = 0; i < matches.Count; i++)
{
TextRange TR_Temp = new TextRange(TR_Input.Start.GetPositionAtOffset(matches[i].Index), TR_Input.Start.GetPositionAtOffset(matches[i].Index + matches[i].Length));
TR_Temp.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.DodgerBlue);
}
NoRTBChangeEvent = false;
}
Обновление 1:
После решения user8478480 я изменил свойкод.
private void ColorizeAllVariable(RichTextBox richTextBox)
{
IEnumerable<TextRange> WordRanges = GetAllWordRanges(richTextBox.Document, @"(<\*.[^<\*>]*\*>)");
foreach (TextRange WordRange in WordRanges)
{
WordRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.DodgerBlue);
}
}
private static IEnumerable<TextRange> GetAllWordRanges(FlowDocument document, string pattern)
{
TextPointer pointer = document.ContentStart;
while (pointer != null)
{
if (pointer.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
{
string textRun = pointer.GetTextInRun(LogicalDirection.Forward);
MatchCollection matches = Regex.Matches(textRun, pattern);
foreach (Match match in matches)
{
int startIndex = match.Index;
int length = match.Length;
TextPointer start = pointer.GetPositionAtOffset(startIndex);
TextPointer end = start.GetPositionAtOffset(length);
yield return new TextRange(start, end);
}
}
pointer = pointer.GetNextContextPosition(LogicalDirection.Forward);
}
}
Он непосредственно ищет слова, которые выглядят как <* word *>.И он находит все слова, но все еще имеют проблемы с форматированием символов.
Это результат.Второе слово в строке имеет неправильную позицию окраски
Так выглядит строка при поиске слова
Этоеще одна попытка
Я вижу проблему, когда я добавляю свойство цвета, оно сдвигает данные, но мое совпадение содержит позицию до раскрашивания.
Это выглядит легко, если у меня есть большечем одно совпадение в одной строке я всегда смещаю позицию на постоянное значение.Но символы форматирования не всегда выглядят одинаково.Как вы можете видеть со второй попытки, цвет первой переменной правильный.Чем вторая имеет 5 символов, третья переменная также имеет 5 символов, четвертая переменная имеет 9 символов, пятая - 13 символов, шестая ... (я понятия не имею, что здесь происходит)и последняя седьмая переменная также имеет хорошую цветовую позицию.