Ответ 1
Хорошо, этот вопрос старый, но я наконец нашел ответ, поэтому я поставил его здесь.
У меня возникали похожие проблемы, когда я пытался создать Syntaxhighlighter с помощью RichTextBox. Я узнал, что, когда вы играете arround с ApplyPropertyValue, вы больше не можете просто использовать GetPositionAtOffset. Я считаю, что применение свойств-свойств, по-видимому, изменяет "внутренние позиции" TextTokens внутри документа, и, следовательно, "тормозит" эту функциональность.
Обходной путь:
Каждый раз, когда вам нужно работать с GetPositionAtOffset первым вызовом ClearAllProperties в полном текстовом поле документа, а затем повторно применить все свои свойства с помощью ApplyPropertyValue, но thistime справа налево. (справа означает наивысшее смещение)
Я не знаю, применяли ли вы какие-либо свойства PropertyValues для выделения выделения, поэтому вам может потребоваться больше думать.
Вот как выглядел мой код, когда он вызвал проблему:
private void _highlightTokens(FlowDocument document)
{
TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd);
foreach (Token token in _tokenizer.GetTokens(fullRange.Text))
{
TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position);
TextPointer end = start.GetPositionAtOffset(token.Length);
TextRange range = new TextRange(start, end);
range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token));
}
}
И я исправил это следующим образом:
private void _highlightTokens(FlowDocument document)
{
TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd);
fullRange.ClearAllProperties(); // NOTICE: first remove allProperties.
foreach (Token token in _tokenizer.GetTokens(fullRange.Text).Reverse()) // NOTICE: Reverse() to make the "right to left" work
{
TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position);
TextPointer end = start.GetPositionAtOffset(token.Length);
TextRange range = new TextRange(start, end);
range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token));
}
}