У меня есть этот WPF RichTextBox, и я хочу программно выбрать заданный диапазон букв / слов и выделить его. Я пробовал это, но это не работает, вероятно, потому что я не принимаю во внимание некоторые скрытые теги FlowDocument или подобные. Например, я хочу выбрать буквы 3-8, но выбираются 2-6):
var start = MyRichTextBox.Document.ContentStart;
var startPos = start.GetPositionAtOffset(3);
var endPos = start.GetPositionAtOffset(8);
var textRange = new TextRange(startPos,endPos);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty,
new SolidColorBrush(Colors.Blue));
textRange.ApplyPropertyValue(TextElement.FontWeightProperty,
FontWeights.Bold);
Я понял, что обработка RichTextBox немного сложнее, чем я думал:)
Обновление: я получил несколько ответов на форумах MSDN: Эта тема , где seid "dekurver":
Указанные смещения не являются
смещения символов, но смещения символов.
Что вам нужно сделать, это получить
TextPointer, который вы знаете, находится рядом
к тексту, тогда вы можете добавить символ
Смещения.
И «ЛестерЛобо» сказал:
вам нужно будет пройти через
абзацы и строки, чтобы найти
Далее, а затем их смещения в цикле
подать заявку на все выступления
конкретный текст. обратите внимание, что при редактировании
ваш текст будет двигаться, но ваш
выделить не будет двигаться как его
связано со смещением, а не
текст. Однако вы можете создать
пользовательский запуск и выделить
это ...
Все равно ЛЮБЛЮ видеть какой-то пример кода для этого, если кто-то знает, как обходить FlowDocuments ...
РЕДАКТИРОВАТЬ Я получил работающую версию кода Kratz VB, она выглядит так:
private static TextPointer GetPoint(TextPointer start, int x)
{
var ret = start;
var i = 0;
while (i < x && ret != null)
{
if (ret.GetPointerContext(LogicalDirection.Backward) ==
TextPointerContext.Text ||
ret.GetPointerContext(LogicalDirection.Backward) ==
TextPointerContext.None)
i++;
if (ret.GetPositionAtOffset(1,
LogicalDirection.Forward) == null)
return ret;
ret = ret.GetPositionAtOffset(1,
LogicalDirection.Forward);
}
return ret;
}
И я использую это так:
Colorize(item.Offset, item.Text.Length, Colors.Blue);
private void Colorize(int offset, int length, Color color)
{
var textRange = MyRichTextBox.Selection;
var start = MyRichTextBox.Document.ContentStart;
var startPos = GetPoint(start, offset);
var endPos = GetPoint(start, offset + length);
textRange.Select(startPos, endPos);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty,
new SolidColorBrush(color));
textRange.ApplyPropertyValue(TextElement.FontWeightProperty,
FontWeights.Bold);
}