Сформируйте события KeyUp и KeyDown для изменения переменных - PullRequest
1 голос
/ 28 ноября 2011

В моем приложении у меня есть:

private bool _clear = true;

Это логическое значение используется для определения необходимости очистки текстового поля при вводе пользователем нового текста (нажатием на TreeNode в TreeView).

Тогда у меня есть два события для моей формы:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Modifiers == Keys.Control)
    {
        _clear = false;
    }

}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Modifiers == Keys.Control)
    {
        _clear = true;
    }
}

Я хочу как-то, когда пользователь удерживает клавишу CTRL, очистить быть FALSE, а когда CTRL отпущен, очистка возвращается к TRUE.

Очевидно, что код, который я здесь написал, не работает! что может быть не так и / или есть ли лучший способ?

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Это простое исправление, так как при отпускании ключа событие KeyUp не получает никакой информации о выпущенном ключе, поэтому просто установите для свойства значение true:

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
   _clear = true;       
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
   if (e.Modifiers == Keys.Control)
   {
      _clear = false;
   }
}

Если вы хотите, чтобы он работал в режиме реального времени, добавьте метку в форму и добавьте ее под каждым параметром переменной _clear:

label1.Text = _clear.ToString();

За ваш комментарий измените второй блок кода на:

if (e.KeyData.ToString() == "ControlKey, Control")
{
   _clear = false;                  
}
else if(other shortcut conditionals go here or on other else if's)
{
   _clear = true;
}

Единственное время, в течение которого это условие будет выполняться, - это когда контроль удерживается сам по себе. В другом случае это делается для того, чтобы установить _clear в true, когда вы нажимаете ctrl, а затем другую клавишу, потому что, как только вы нажимаете control, оно запускает событие KeyDown.

Исходя из этого изменения, до тех пор, пока вы позаботитесь о нажатиях клавиш, следующих за оператором if (например, else if ()), вам не нужно ничего устанавливать в событии KeyUp.

См. мой ответ здесь на тонкости ключей и их свойств , если вам нужна более подробная информация.

Редактировать # 3:

Пока вы устанавливаете _clear в true в первой строке каждого условия, вы сможете избежать проблемы, с которой вы столкнулись в своем комментарии:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{

   if (e.KeyData.ToString() == "ControlKey, Control")
   {
      _clear = false;

   }
   else if(e.KeyData.ToString() == "O, Control")
   {
       _clear = true;
       //Do other stuff here, such as opening a file dialog

   }

}
2 голосов
/ 28 ноября 2011

Будет намного проще, если вы сделаете это наоборот.Проверьте, не нажата ли клавиша CTRL в событии древовидной структуры.Как то так:

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
        if ((Control.ModifierKeys & Keys.Control) == Keys.Control) {
            // Control key is down, do something...
        }
    }
1 голос
/ 28 ноября 2011

Вам необходимо изменить свойство KeyPreview вашей формы на True.

...