C# TextBox Auto Caps Lock включен - PullRequest
       75

C# TextBox Auto Caps Lock включен

0 голосов
/ 08 января 2020

Мне нужен следующий код: Когда я нажимаю клавишу Shift, я пишу маленькие буквы в своем TextBox, в противном случае я пишу большими буквами что-то вроде «реверса» или все время нажатой клавишу Caps Lock. Так что этот код и другие подобные символы беспомощны, потому что есть только один вид размера букв:

textBox1.CharacterCasing = CharacterCasing.Upper;
textBox1.CharacterCasing = CharacterCasing.Lower;

Спасибо за помощь!

1 Ответ

0 голосов
/ 08 января 2020

Самый простой вариант - изменить текст в методе события TextChanged. После ввода персонажа измените его раскладку. Но вы должны помнить, что текст может быть вставлен / вырезан.

Если вы игнорируете эту проблему, вы можете использовать этот простой пример:

public partial class Form1 : Form
{
    int last_len = 0;
    bool char_to_lower = false;
    public Form1()
    {
        InitializeComponent();
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        // save last cursor position
        var select_index = textBox1.SelectionStart;
        // if text not delete - change char casing
        if (textBox1.Text.Length > last_len && select_index > 0)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(textBox1.Text.Take(select_index - 1).ToArray());

            // check SHIFT and CAPS
            if (char_to_lower || Control.IsKeyLocked(Keys.CapsLock))
                sb.Append(textBox1.Text[select_index - 1].ToString().ToLower());
            else
                sb.Append(textBox1.Text[select_index - 1].ToString().ToUpper());

            sb.Append(textBox1.Text.Skip(select_index).ToArray());

            // insert new text in textBox
            textBox1.Text = sb.ToString();
            // return cursor position
            textBox1.SelectionStart = select_index;
        }
        // save last length
        last_len = textBox1.Text.Length;
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.ShiftKey || e.KeyCode == Keys.Shift) char_to_lower = true;
    }

    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.ShiftKey || e.KeyCode == Keys.Shift) char_to_lower = false;
    }
}
...