Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > RichTextBox, форматирование текста


Автор: Fedia 3.11.2010, 02:55
В компоненте RichTextBox отображается текст типа:
Код

Ш1 11015/7/2008 010108 1/1 261 59558 171042
Ш3 1 261 400/435.6 
Ш6 13524/264 12675/10.78 12431/4.05 12509/20.71 
Ш7 102 435.6 1 80 280 
Ш8 1/755.243 4/102.254 13/491.7 14/71 15/39 16/439 94/235 
Ш12 13524/4450.16 13494/2698.6 12675/254.98 13817/11.44 12431/137.25 12509/596.14 12598/426.4 
Ш13 33/5 32/80 17/155
 
При помощи регулярных выражений определяю позиции нужных мне полей в этом тексте. Зная эти позиции мне необходимо выделить их в тексте (например другим цветом). Сложность заключается в том, что позиции поля в тексте не совпадают со смещением позиции относительно начала документа в RichTextBox.
Например, поле 261 в блоке Ш3 (вторая строка) начинается с 50-го символа в тексте и имеет длину 3 символа. Для выделения этого поля использую код:
Код

            TextPointer StartDocument = RichText.Document.ContentStart;
            TextPointer TextPointerFrom = StartDocument.GetPositionAtOffset(50);
            TextPointer TextPointerTo = StartDocument.GetPositionAtOffset(53);
            RichText.Selection.Select(TextPointerFrom, TextPointerTo);
            RichText.Selection.ApplyPropertyValue(Run.BackgroundProperty, new SolidColorBrush(Colors.Red));

но из-за того, что в RichTextBox позиции в тексте смещаются при переходе на новый параграф или когда внутри параграфа есть элемент Run, то выделяется не поле 261, а текст перед ним. Для выделения поля 261 приходится использовать позиции со смещением:
Код

            TextPointer StartDocument = RichText.Document.ContentStart;
            TextPointer TextPointerFrom = StartDocument.GetPositionAtOffset(54);
            TextPointer TextPointerTo = StartDocument.GetPositionAtOffset(57);
            RichText.Selection.Select(TextPointerFrom, TextPointerTo);
            RichText.Selection.ApplyPropertyValue(Run.BackgroundProperty, new SolidColorBrush(Colors.Red));

Есть ли возможность преобразовать позицию в тексте в позицию в RichTextBox? Иными словами из позиции 50 получить позиции 54. Сейчас я пробегаю по всем параграфам а внутри параграфов по Inlines для определения позиции. Но работает такой способ достаточно медленно при работе с большим количеством текста. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)