2010-04-05 2 views
2

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

// 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. Это возможно?

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

ответ

3

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

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

SomeToken |

вместо

SomeToken |

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

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

+0

Спасибо за ваш ответ Benny. Да, это стандартное поведение, но я пытаюсь реализовать подсветку синтаксиса и, скорее всего, этого не сделал. В событии TextChanged я просто вызываю свою процедуру разбора, которая создает маркеры, которые имеют начальную и конечную позиции, которые я использую для создания TextRange (я добавил этот код в свой первоначальный вопрос). Использование пробелов как разделителя - это возможность, но я бы предпочел избежать этого, поскольку пробелы не гарантируются. Спасибо, Alan –

+0

Ну, это не должно быть пробелом в качестве разделителя. Я предлагаю ** подождать **, чтобы применить стиль, пока курсор не будет на 'endOffset + 1', поэтому между курсором и текстовым диапазоном есть что-то. Так что даже после того, как тип 'SomeToken'' * * * заканчивается набирать «n», токен еще не выбран. Но, когда я набираю символ * next *, 'SomeToken {|', то токен найден и оформляется при вводе «{» (или любого другого символа). Я заметил, что подсветка синтаксиса работает в некоторых других программах. Извините, если я не понял. Надеюсь, что это яснее. –

+0

Еще раз спасибо Бенни.Не волнуйся, ты был очень ясен. То, что я пытался избежать, это полный сброс форматирования при каждом анализе, но я все еще вижу ситуации, когда поведение RichTextBox, когда оно наследует смежное форматирование, которое вызовет у меня проблемы, если я не полностью сброшу форматирование. Я уверен, что будет счастливая среда. Thanks, Alan –

Смежные вопросы