我如何去除 C# Windows Forms ComboBox.PreviewKeyDown 事件的抖动?
How can I debounce a C# Windows Forms ComboBox.PreviewKeyDown event?
我想去除 Windows Forms ComboBox.PreviewKeyDown 事件的抖动,因为它似乎总是触发重复事件。我希望每次击键只发生 1 个事件。
例如:
创建新的 C# Windows Forms 应用程序(我试过 .NET 4.6.2 和 4.7.2)
向主窗体添加一个 ComboBox 和一个 TextBox
设置textBox1.Multiline = true;
添加 comboBox1.PreviewKeyDown 事件处理程序代码以将结果附加到 textBox1.Text
运行 并观察 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
事件处理程序。
上面的实施 适用于示例:
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;
}
}
}
我想去除 Windows Forms ComboBox.PreviewKeyDown 事件的抖动,因为它似乎总是触发重复事件。我希望每次击键只发生 1 个事件。
例如:
创建新的 C# Windows Forms 应用程序(我试过 .NET 4.6.2 和 4.7.2)
向主窗体添加一个 ComboBox 和一个 TextBox
设置textBox1.Multiline = true;
添加 comboBox1.PreviewKeyDown 事件处理程序代码以将结果附加到 textBox1.Text
运行 并观察 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
事件处理程序。
上面的实施
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;
}
}
}