我如何去除 C# Windows Forms ComboBox.PreviewKeyDown 事件的抖动?

How can I debounce a C# Windows Forms ComboBox.PreviewKeyDown event?

我想去除 Windows Forms ComboBox.PreviewKeyDown 事件的抖动,因为它似乎总是触发重复事件。我希望每次击键只发生 1 个事件。

例如:

  1. 创建新的 C# Windows Forms 应用程序(我试过 .NET 4.6.2 和 4.7.2)

  2. 向主窗体添加一个 ComboBox 和一个 TextBox

  3. 设置textBox1.Multiline = true;

  4. 添加 comboBox1.PreviewKeyDown 事件处理程序代码以将结果附加到 textBox1.Text

  5. 运行 并观察 comboBox1 中的每个击键都会触发 PreviewKeyDown 事件 2 次!

using System.Windows.Forms;

namespace ComboBox_Bounce
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
      // Hookup event here in code, not in the Designer
      this.comboBox1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.comboBox1_PreviewKeyDown);
    }

    private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
      this.textBox1.Text += "comboBox1_PreviewKeyDown=" + e.KeyCode.ToString() +  + System.Environment.NewLine;
    }
  }
}

平台:Visual Studio16.5.4,Windows10[1809]所有当前更新。

Control.PreviewKeyDown 应该只用于测试特定的按键,如果是这种情况,然后将 Control.IsInputKey 设置为 true,否则你应该使用 Control.KeyDown事件处理程序。

Control.PreviewKeyDown Event

上面的实施 适用于示例:

using System.Windows.Forms;

namespace ComboBox_Bounce
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
      this.comboBox1.PreviewKeyDown += this.comboBox1_PreviewKeyDown;
      this.comboBox1.KeyDown += ComboBox1_KeyDown;
    }

    private void ComboBox1_KeyDown(object sender, KeyEventArgs e)
    {
      this.textBox1.Text += "comboBox1_KeyDown=" + e.KeyCode.ToString() + System.Environment.NewLine;
    }

    private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
      this.textBox1.Text += "comboBox1_PreviewKeyDown=" + e.KeyCode.ToString() + System.Environment.NewLine;
      e.IsInputKey = true;
    }
  }
}