我有一个基本的自定义对话框,可用于WinForms应用程序中的各种控件。该对话框如下所示:
由于各种原因,我不希望用户能够使用Enter
键选择“是”选项(buttonYes
)。以前我确实想要这种行为,并相应地设置了Yes按钮(AcceptButton
)的buttonYes
属性。我已将scince删除,将buttonYes
的{{1}}属性设置为“无”,但是当按下AcceptButton
键时,表单仍会触发buttonYes.Click
事件。我还尝试处理Enter
或KeyPress
事件,但在使用KeyDown
密钥时不会触发这些事件。这是基本和烦人的,有没有人遇到过这个,我该怎么做才能实现我想要的功能?
答案 0 :(得分:8)
要解决此问题,请将TabStop
属性设置为False
并使用以下代码:
private void form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
e.Handled = true;
}
或者,如果如你所说,你无法在KeyPressEvent中断,你需要处理ProcessKeyPreview
protected override bool ProcessKeyPreview(ref System.Windows.Forms.Message m)
{
int _ENTER = 13;
if (m.Msg == _ENTER)
{
//Do nothing
}
return base.ProcessKeyPreview(ref m);
}
答案 1 :(得分:6)
这里的所有答案都是错误的或有错误的重点。
为了理解发生了什么,你必须理解Form.ShowDialog(...)的实现方式。在幕后,ShowDialog将进入自己的消息循环。该消息循环具有硬编码逻辑,专门处理Enter键。
对话框不会关闭,因为OK按钮有焦点,按下按钮,WinForms执行OK按钮的点击逻辑,关闭窗口。对话框正在关闭,因为Enter按消息正在从调用堆栈顶部运行的消息循环中被消耗掉,并导致ShowDialog突破其循环并关闭窗口...所以你可以&# 39;通过处理按钮上的按键事件来获得所需的功能;从不发送Enter的按键事件。通过KeyPreview进行的事件只是获取相同事件的另一种方式,因此这也无济于事。
唯一有效的方法是将表单的AcceptButton属性设置为(none)。 OK按钮仍然可以将其DialogResult属性设置为OK,这样做不会破坏对话框,但是当AcceptButton设置为none时,WinForms会忽略从ShowDialog中输入点击次数。
答案 2 :(得分:4)
此外,如果您想确保用户必须点击按钮而不是使用键盘,您可以在按钮上将TabStop
属性设置为False
。
答案 3 :(得分:1)
由于您已经更改了Accpet按钮属性:表单的KeyPreview属性如何?是假的还是真的?也许你一路上把它设置为真,忘了它。 将其设置为false。
答案 4 :(得分:1)
我只需要处理这个问题,提供的任何解决方案都无法正常工作,因此我可以处理Click事件,例如:
private void yes_Click( object sender, EventArgs e )
{
if( e.Equals( EventArgs.Empty ) )
return; // ignore "Enter" key press
// process mouse click...
}
答案 5 :(得分:0)
您应该查看* .resx或* .ressources文件。
搜索AcceptButton
属性。它可能已在其中一个文件中设置。