RichTextBox невидимый выбираемый символ в конце строки

#c# #.net #winforms

#c# #.net #winforms

Вопрос:

При выделении текста в RichTextBox с помощью мыши или клавиш со стрелками shift я могу выбрать дополнительный пустой символ в конце строки. Для воспроизведения:

  • введите несколько символов (или вообще ничего) в RichTextBox

  • установите курсор в конец строки

  • удерживая shift, нажмите клавишу со стрелкой вправо

Вы увидите узкое выделенное выделение, которое нельзя удалить.

Это вызывает проблему в моем приложении, потому что свойство SelectionFont возвращает null, когда дополнительный символ выбран вместе с некоторым допустимым текстом. Есть идеи о том, как отключить этот дополнительный символ или обойти его в противном случае?

c # winforms, visual studio 2010

Комментарии:

1. Это фактический символ? Например, если вы берете всю строку и обрезаете ее конец (или подстроку-1), она там есть?

2. Я не думаю, что это реальный символ. Если я посмотрю на свойства RichTextBox, когда выбран только дополнительный символ, SelectedText возвращает пустую строку, SelectionLength равно 0, SelectionType равно ‘Empty’ . Кроме того, свойство textLength RichTextBox не включает этот дополнительный символ.

Ответ №1:

Интересно.(Это не доктор Хаус, доктор медицинских наук, говорит.)

Когда в пустом элементе управления редактированием RTF ничего не выбрано, SelectedRtf возвращает:

 "{rtf1ansiansicpg1252deff0deflang2055uc1 }"
  

Когда «фантомный» материал выбран в пустом элементе управления редактированием RTF, SelectedRtf возвращает:

 "{rtf1ansiansicpg1252deff0deflang2055{fonttbl{f0fnilfcharset0 Microsoft Sans Serif;}}
viewkind4uc1pardf0fs17par
}"
  

Конечно, SelectedText в обоих случаях возвращает пустую строку.

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

Однако это кажется бессмысленным, поскольку вновь введенный текст будет вставлен правильным шрифтом, даже если ничего не выбрано.

Так что все это не имеет смысла. (Ну, это так, вроде как — см. Последний абзац)

Что заставляет меня поверить, что это ошибка или, по крайней мере, сбой в RichTextBox.

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

Ответ №2:

Запустил новое приложение winforms в studio 2010 и на самом деле не смог воспроизвести это. Я могу выбрать невидимый «символ», но это не вызывает у меня никаких проблем. SelectedFont по-прежнему возвращает допустимый объект для меня. Я могу получить текст без проблем.

Комментарии:

1. Как упоминалось выше, «дополнительный символ», похоже, не является фактическим символом, а просто артефактом пользовательского интерфейса, связанным с элементом управления RichTextBox. Я не думаю, что манипулирование строками здесь что-то даст.

2. Полагаю, я не понимаю, что вы тогда делаете. Я предположил, что вы получаете значение из текстового поля и имеете возможность проверить его правильность.

3. У него проблемы не со значением выбранного «текста», а с его шрифтом.

Ответ №3:

SelectionFont Свойство для элемента RichTextBox управления может возвращать ТОЛЬКО один шрифт. Если выбранный диапазон содержит более одного шрифта, чтение SelectionFont свойства вызовет NullReferenceException .

Скорее всего, происходит то, что RichTextBox Font свойство отличается от текущего шрифта, который вы используете в выбранном диапазоне. Этот «дополнительный» символ, выбранный в конце, является вашим Font свойством, а не вашим SelectionFont свойством.

Если вы RichTextBox используете только один шрифт, просто убедитесь Font , SelectionFont что свойство and совпадает.

В противном случае просто проверьте, имеет ли оно значение null:

 if (richTextBox1.SelectionFont != null) {
  //do something
}