【发布时间】:2020-04-16 13:40:17
【问题描述】:
我想消除 Windows 窗体 ComboBox.PreviewKeyDown 事件的抖动,因为它似乎总是触发重复事件。我希望每次击键只发生 1 个事件。
例如:
创建一个新的 C# Windows 窗体应用程序(我尝试过 .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 Studio 16.5.4、Windows 10 [1809] 所有当前更新。
【问题讨论】:
-
您是否也在设计器中将
comboBox1_PreviewKeyDown设置为PreviewKeyDown事件的处理程序? -
否:在示例中,唯一处理程序在代码中。我分别尝试了设计器处理程序和 += 代码方式,结果相同。为了清楚起见,我将 += 代码处理程序放在我的问题中。如果我添加
textBox1.PreviewKeyDown处理程序,则 textBox1 事件每次击键只会正确触发一次。这个问题似乎是 ComboBox 特有的。 -
我对弹跳行为的问题是:我没有找到文档,所以我不知道它是否足够一致,我可以安全地忽略所有其他 ComboBox.PreviewKeyDown 事件。
-
来自documentation:“您不应该在 PreviewKeyDown 事件处理程序中放置任何逻辑,除了设置 IsInputKey 属性。相反,您应该将您的逻辑放在 KeyDown 事件处理程序中。”
-
ComboBox 是一个复合控件...有 MessageLoop 和 Dispatcher。你为什么使用这个事件而不是 KeyDown?还是覆盖自定义控件的 WndProc 或 ProcessCmdKey?
标签: c# winforms combobox debounce