Причина, по которой вы не можете покинуть текстовое поле, заключается в том, что вы изменяете свойство CharacterCasing в текстовом поле.
Не уверен, почему это работает так, но со мной это случалось раньше, в итоге я захватил событие нажатия клавиши, и если бы это была буква, я бы переключил его на значение в верхнем регистре. Это не оптимально, но работает
Я сделал что-то похожее на это (записал это от макушки головы, но это должно работать):
void YourTextbox_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsLetter(e.KeyChar))
{
if (this.CharacterCasing == CharacterCasing.Upper && char.IsLower(e.KeyChar))
{
this.Text = this.Text.Insert(this.SelectionStart, char.ToUpper(e.KeyChar) + string.Empty);
this.SelectionStart++;
e.Handled = true;
}
else if (this.CharacterCasing == System.Windows.Forms.CharacterCasing.Lower && char.IsUpper(e.KeyChar))
{
this.Text = this.Text.Insert(this.SelectionStart, char.ToLower(e.KeyChar) + string.Empty);
this.SelectionStart++;
e.Handled = true;
}
}
}
Вы также должны использовать новое ключевое слово, чтобы "переопределить" (я знаю, что это неправильный термин здесь) регистр символов, поэтому он не делает свое дело
public new CharacterCasing CharacterCasing { get; set; }
Код в основном проверяет, является ли нажатая клавиша буквой, затем, если она помечена как Upper, а символ более низкий, заменяет его на верхнюю версию (в позиции курсора), а затем перемещает курсор на следующую часть, и наоборот (toLower)
Примечание:
Этот код может иметь (должен) иметь некоторые проблемы, если у пользователя выбрано более одного символа (SelectionLenght> 0), если вы хотите сохранить обычную функциональность Textbox, вы должны удалить все выбранные символы