如何取消对C#Windows窗体ComboBox.PreviewKeyDown事件的冻结?
我想取消Windows窗体ComboBox.PreviewKeyDown事件的冻结,因为它似乎总是触发重复事件。我只希望每次击键只有一个事件 例如:如何取消对C#Windows窗体ComboBox.PreviewKeyDown事件的冻结?,c#,winforms,combobox,debounce,C#,Winforms,Combobox,Debounce,我想取消Windows窗体ComboBox.PreviewKeyDown事件的冻结,因为它似乎总是触发重复事件。我只希望每次击键只有一个事件 例如: 创建一个新的C#Windows窗体应用程序(我尝试了.NET 4.6.2和4.7.2) 向主窗体添加组合框和文本框 设置textBox1.Multiline=true 添加comboBox1.PreviewKeyDown事件处理程序代码,以将结果附加到textBox1.Text 运行并观察comboBox1中的每一次击键都会触发PreviewKey
使用System.Windows.Forms;
名称空间组合框
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
//连接事件在代码中,而不是在设计器中
this.comboBox1.PreviewKeyDown+=new System.Windows.Forms.PreviewKeyDownEventHandler(this.comboBox1\u PreviewKeyDown);
}
私有void组合框1_PreviewKeyDown(对象发送方,PreviewKeyDownEventArgs e)
{
this.textBox1.Text+=“comboBox1_PreviewKeyDown=“+e.KeyCode.ToString()++System.Environment.NewLine;
}
}
}
平台:Visual Studio 16.5.4、Windows 10[1809]所有当前更新。控件。PreviewKeyDown应仅用于测试特定按键,然后设置
控件。如果是这种情况,则IsInputKey
为true,否则应使用控件.KeyDown
事件处理程序
有关示例,请参见实施上述工作:
使用System.Windows.Forms;
名称空间组合框
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
this.comboBox1.PreviewKeyDown+=this.comboBox1_PreviewKeyDown;
this.comboBox1.KeyDown+=combobox1u KeyDown;
}
私有void组合框1u KeyDown(对象发送方,KeyEventArgs e)
{
this.textBox1.Text+=“comboBox1_KeyDown=“+e.KeyCode.ToString()+System.Environment.NewLine;
}
私有void组合框1_PreviewKeyDown(对象发送方,PreviewKeyDownEventArgs e)
{
this.textBox1.Text+=“comboBox1_PreviewKeyDown=“+e.KeyCode.ToString()+System.Environment.NewLine;
e、 IsInputKey=true;
}
}
}
是否也将
comboBox1\u PreviewKeyDown
设置为设计器中PreviewKeyDown
事件的处理程序?否:在示例中,唯一的处理程序在代码中。我分别尝试了设计器处理程序和+=代码方式,结果相同。为了清楚起见,我在问题中加入了+=代码处理程序。如果我添加textBox1.PreviewKeyDown
处理程序,textBox1事件将在每次击键时正确触发一次。此问题似乎特定于ComboBox。我的反弹行为问题是:我没有找到记录的,因此我不知道它是否足够一致,我可以安全地忽略其他ComboBox.PreviewKeyDown事件。从:您不应在PreviewKeyDown事件处理程序中放置任何逻辑,而应设置IsInputKey属性。相反,您应该将逻辑放在KeyDown事件处理程序中。“ComboBox是一个复合控件…有MessageLoop和Dispatcher。为什么要使用此事件而不是KeyDown?或者重写自定义控件的WndProc或ProcessCmdKey?