У меня есть этот 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: Этот поток, где "dekurver" seid:
Сдвиги, которые вы указываете, не являются смещения символов, но смещения символов. Что вам нужно сделать, так это получить TextPointer, который, как вы знаете, смежен в текст, то вы можете добавить символ Смещения.
И "LesterLobo" сказал:
вам нужно будет пройти через абзацев и строк, чтобы найти Затем, а затем их смещения в цикле подать заявку на все выступления конкретный текст. обратите внимание, что при редактировании ваш текст будет перемещаться, но ваш выделить не будет связанных со смещением не текст. Однако вы могли создать пользовательский запуск и это...
По-прежнему ЛЮБОВЬ, чтобы увидеть пример кода для этого, если кто-то знает свой путь вокруг FlowDocuments...
EDIT У меня есть версия кода 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);
}