【问题标题】:WinForms KeyDown event losing keyboard input on first usageWinForms KeyDown 事件在第一次使用时丢失键盘输入
【发布时间】:2011-02-01 15:57:04
【问题描述】:

我正在尝试制作一个 WinForms 程序,以便 TextBox 通常隐藏(可见 = 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();
      }
   }
}

这是一系列的屏幕截图:

首先我在键盘上按了“a”。这确实会导致 TextBox 变得可见并获得焦点,但“a”显然在某处丢失了。

然后我按 Esc。这正确地使 TextBox 再次不可见。

然后我按“b”。这一次(以及所有,或至少几乎所有后续时间)它工作了 - TextBox 变得可见,获得焦点,并且键盘输入没有丢失 - 它显示在 TextBox 中。

关于为什么它第一次不起作用的任何建议?或者完成我想做的事情的替代方法?

谢谢。

编辑:只需将 KeyPress 添加为附加标签。

【问题讨论】:

    标签: c# winforms keypress keydown


    【解决方案1】:

    改用表单上的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;
        }                
    }
    

    【讨论】:

      【解决方案2】:

      来自docs for KeyPreview

      当此属性设置为 true 时, 表单将接收所有 KeyDown (etc) 事件。之后 表单的事件处理程序已完成 处理击键, 然后将击键分配给 重点控制。

      当窗体启动时,文本框控件被禁用,因此没有焦点。

      当按下第一个键时,文本框控件没有焦点,因为表单无法处理它,所以按键丢失:在随后的按键中,控件接收输入,因为它仍然具有焦点 - 我猜它是表单上唯一的控件,因为如果有另一个控件,当文本框被禁用时焦点会转移到它,随后的按键会像最初的一样消失。

      另一种方法是从表单边界外的文本框开始,然后将其移入和移出,而不是使其可见/不可见。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多