Событие WinForms KeyDown теряет ввод с клавиатуры при первом использовании - PullRequest
0 голосов
/ 01 февраля 2011

Я пытаюсь сделать программу WinForms такой, чтобы TextBox обычно скрывался (Visible = false), пока пользователь не начнет печатать на клавиатуре, после чего TextBox должен стать видимым, а ввод с клавиатуры должен перейти в TextBox .

Вот программа, сведенная к основным частям:

using System.Windows.Forms;

namespace TestTextEditPopup
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();

         this.KeyPreview = true;
         textBox1.Visible = false;
      }

      protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
      {
         if (keyData != Keys.Escape)
            return base.ProcessCmdKey(ref msg, keyData);

         textBox1.Visible = false;
         return true;  // Key has been processed
      }

      private void Form1_KeyDown(object sender, KeyEventArgs e)
      {
         textBox1.Visible = true;
         textBox1.Focus();
      }
   }
}

А вот и серия снимков экрана:

And here's a series of screen shots

Сначала я нажал "а" на клавиатуре. Это приводит к тому, что TextBox становится видимым и получает фокус, но «a» где-то потеряно.

Тогда я нажал Esc. Это правильно делает TextBox снова невидимым.

Тогда я нажал "b". На этот раз (и для всех, или, по крайней мере, почти для всех последующих) это работает - TextBox становится видимым, получает фокус, а ввод с клавиатуры не теряется - он отображается в TextBox.

Есть предложения, почему это не работает с первого раза? Или альтернативные методы выполнения того, что я пытаюсь сделать?

Спасибо.

Редактировать: просто добавив KeyPress в качестве дополнительного тега.

Ответы [ 2 ]

2 голосов
/ 01 февраля 2011

Вместо этого используйте форму KeyPress в форме; затем вы получаете доступ к символьным данным, поэтому вы можете добавить символ к элементу управления TextBox и затем сфокусировать его:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (this.ActiveControl != textBox1)
    {
        textBox1.Visible = true;
        textBox1.Focus();
        textBox1.Text += e.KeyChar;
        textBox1.Select(textBox1.Text.Length, 0);
        e.Handled = true;
    }                
}
0 голосов
/ 01 февраля 2011

Из документов для KeyPreview

Если для этого свойства установлено значение true, форма будет получать все события KeyDown (и т. Д.).После того, как обработчики событий формы завершили обработку нажатия клавиши, нажатие клавиши затем назначается элементу управления с фокусом.

Когда форма запускается, элемент управления текстовым полем отключается и, следовательно, выполняетне иметь фокуса.

Поскольку при нажатии первой клавиши элемент управления текстового поля не имеет фокуса, нажатие клавиши теряется, поскольку форма не может его обработать: при последующих нажатиях клавиш элемент управления получает ввод, поскольку он все еще имеет фокус - I 'Я предполагаю, что это единственный элемент управления в форме, потому что, если бы был другой элемент управления, фокус переместился бы на него, когда текстовое поле стало недоступным, и последующие нажатия клавиш исчезли бы, как и начальное.

Другой способ сделать этобудет начинаться с текстового поля вне границ формы и сдвигать его внутрь и наружу, а не делать его видимым / невидимым.

...