WPF RichTextBox - форматирование набранного текста - PullRequest
2 голосов
/ 05 апреля 2010

Я применяю форматирование к выбранным токенам в WPF RichTextBox. Для этого я получаю TextRange, который включает в себя токен, который я хотел бы выделить. Затем я изменю цвет текста следующим образом:

// Get start and end pointer for token
TextPointer startPointer = run.ContentStart.GetPositionAtOffset(startOffset);
TextPointer endPointer = run.ContentStart.GetPositionAtOffset(endOffset);

// Get text range for token
TextRange textRange = new TextRange(startPointer, endPointer);

// Highlight token
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue);

Это происходит с событием TextChanged моего RichTextBox.

Форматирование применяется должным образом, но продолжение ввода текста приведет к тому, что новый текст унаследует форматирование, которое уже применено к смежному слову. Я хотел бы, чтобы форматирование любого нового текста использовало параметры форматирования по умолчанию, определенные в свойствах RichTextBox. Это возможно?

В качестве альтернативы я мог бы выделить все токены, которые я не хочу выделять синим цветом, с параметрами форматирования по умолчанию, но мне это неудобно.

1 Ответ

3 голосов
/ 05 апреля 2010

Разве это не стандартное поведение? Если я выделю текст в Word, выделю его жирным шрифтом, переместу курсор рядом с этим текстом и введите текст, новый текст тоже станет жирным. Я мог бы предположить, что MS заставила поле расширенного текста работать аналогично текстовой области в Word.

Если вы выбираете токен на основе соответствия некоторым критериям, например, для подсветки синтаксиса, не могли бы вы попробовать применить стиль к тексту после курсор находится на расстоянии 1 символа от токена? Например:

SomeToken |

вместо

SomeToken |

, где | - курсор. Курсор отделен от токена пробелом в первом примере, поэтому, если ваша программа найдет SomeToken, она получит текстовый диапазон от S до (пробел). Я полагаю, что тогда стиль не будет применяться к вновь введенному тексту.

Я признаю, что это всего лишь предположение, и я мог неправильно понять вашу точную ситуацию из описания вашей проблемы. Может пригодиться еще немного кода, в частности упомянутое вами событие TextChanged или код, который создает текстовый диапазон.

...