RichTextBox эквивалент TextBox.AcceptsReturn


Я переключаю несколько текстовых полей на RichTextBoxes, чтобы получить некоторые интересные функции.

Мои текстовые поля были настроены на AcceptReturn, так что клавиша enter создаст новую строку, а не покинет элемент управления. RichTextBox, похоже, не имеет этой функции.

Есть ли простой способ сделать это, или я должен захватить все нажатия клавиш и обрабатывать их по отдельности?

4 10

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 имеет фокус. Вот пример кода:

private void RichText_Enter(object sender, EventArgs e)
{
    AcceptButton = null;
}

private void RichText_Leave(object sender, EventArgs e)
{
    AcceptButton = OKActionButton;
}
Это предполагает, что у вас есть только один AcceptButton, и это вряд ли изменится. В противном случае вам придется скопировать некоторую логику поиска AcceptButton здесь или просто создать резервную копию предыдущего значения AcceptButton перед установкой его в ноль.

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

Просто измените опцию Accept в свойстве Richtextbox на "true", это будет работать как волшебство