Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何取消对C#Windows窗体ComboBox.PreviewKeyDown事件的冻结?_C#_Winforms_Combobox_Debounce - Fatal编程技术网

如何取消对C#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

我想取消Windows窗体ComboBox.PreviewKeyDown事件的冻结,因为它似乎总是触发重复事件。我只希望每次击键只有一个事件

例如:

  • 创建一个新的C#Windows窗体应用程序(我尝试了.NET 4.6.2和4.7.2)

  • 向主窗体添加组合框和文本框

  • 设置textBox1.Multiline=true

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

  • 运行并观察comboBox1中的每一次击键都会触发PreviewKeyDown事件2次

  • 使用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?