RichTextBox эквивалент TextBox.AcceptsReturn
Я переключаю несколько текстовых полей на RichTextBoxes, чтобы получить некоторые интересные функции.
Мои текстовые поля были настроены на AcceptReturn, так что клавиша enter создаст новую строку, а не покинет элемент управления. RichTextBox, похоже, не имеет этой функции.
Есть ли простой способ сделать это, или я должен захватить все нажатия клавиш и обрабатывать их по отдельности?
4 ответа:
Примечание: эта проблема возникает только при установке свойства "AcceptButton" формы.
Установите RichTextBox.AcceptsTab к истине. По какой-то причине это работает как для вкладок, так и для клавиши enter. Если вам нужны только клавиши ввода, то вам придется написать пользовательский код.
Решение состоит в том, чтобы переопределить
IsInputKey
:protected override bool IsInputKey(Keys keyData) { if ( (keyData & ~Keys.Modifiers) == Keys.Tab && (keyData & (Keys.Control | Keys.Alt)) == 0 ) return false; return base.IsInputKey(keyData); }
После установки значения
AcceptsTab
в true убедитесь, чтоRichTextBox
обрабатывает как клавишу tab, так и клавишу return. С помощью приведенной выше реализацииIsInputKey
мы гарантируем, что клавиши Tab и Shift+Tab никогда не достигнутRichTextBox
, поэтому они используются для навигации.Вышеуказанное переопределение должно быть вставлено в класс, производный от
RichTextBox
.
Поскольку Картер указал, что это применимо только в том случае, если AcceptButton установлен, а другое решение предполагает вывод класса RichTextBox, я нашел другое простое решение. Просто снимите флажок AcceptButton на то время, пока / A RichTextBox имеет фокус. Вот пример кода:
Это предполагает, что у вас есть только один AcceptButton, и это вряд ли изменится. В противном случае вам придется скопировать некоторую логику поиска AcceptButton здесь или просто создать резервную копию предыдущего значения AcceptButton перед установкой его в ноль.private void RichText_Enter(object sender, EventArgs e) { AcceptButton = null; } private void RichText_Leave(object sender, EventArgs e) { AcceptButton = OKActionButton; }
Это решение также имеет побочный эффект удаления границы по умолчанию из фактической кнопки accept, указывая пользователю, что нажатие клавиши Enter теперь не активирует эту кнопку.