我有一个基本的自定义对话框,用于WinForms应用程序中的各种控件。该对话框如下所示:
出于各种原因,我不希望用户能够使用Enter
键选择"Yes“选项(buttonYes
)。以前,我确实需要此行为,并设置了Yes按钮的AcceptButton
属性(buttonYes
)。我已经删除了这个,将buttonYes
的AcceptButton
属性设置为“None,”但是当按下Enter
键时,窗体仍然会触发buttonYes.Click
事件。我也尝试过处理KeyPress
或KeyDown
事件,但是当使用Enter
键时,这些事件不会被触发。这是基本的,有人遇到过这种情况吗?2我该怎么做才能实现我想要的功能?
7条答案
按热度按时间kq4fsx7k1#
这里所有的答案都是错误的或强调错误。
为了理解发生了什么,你必须理解Form.ShowDialog(...)是如何实现的,基本上。在这个引擎盖下,ShowDialog进入了它自己的消息循环。这个消息循环有硬编码的逻辑,专门处理Enter键。
对话框 * 没有 * 关闭,因为OK按钮具有焦点,按下Enter键,WinForms执行OK按钮的单击逻辑,这将关闭窗口。对话框关闭是因为按下Enter键的消息被从消息循环中提取出来,并导致ShowDialog中断循环并关闭窗口......因此您无法通过处理按钮上的按键事件来获得所需的功能; Enter的按键事件不会被调度。通过KeyPreview的事件只是获取相同事件的另一种方式,因此这也没有帮助。
唯一有效的方法是将窗体的AcceptButton属性设置为(none)。“确定”按钮仍然可以将其DialogResult属性设置为“确定”,这样做不会中断对话框,但是将AcceptButton设置为none时,WinForms将忽略ShowDialog中的Enter单击。
cbjzeqam2#
若要修正这个问题,请将
TabStop
属性设定为False
,并使用下列程式码:或者,如果如您所说,您无法在KeyPressEvent处中断,则需要处理ProcessKeyPreview
gzszwxb43#
此外,如果您要确保使用者必须按一下按钮,而不是使用键盘,您可以在按钮上将
TabStop
属性设定为False
。k75qkfdt4#
由于您已经更改了Accpet按钮属性:那么窗体的KeyPreview属性呢?它是设置为false还是true?也许您在某个地方设置了true,但忘记了它。请将它设置为false。
jgzswidk5#
我只是不得不处理这一点,提供的解决方案都不起作用,所以我处理点击事件,如:
svujldwt6#
您应该查看 *.resx或 *.ressources文件。搜索
AcceptButton
属性。该属性可能已在这些文件之一中设置。x33g5p2x7#
简单的解决方案我尝试了上面的许多解决方案。这是对我有效的。
在InitializeComponent中,确保未设置AcceptButton。删除或注解掉以下代码:
//这个.接受按钮=这个.btnClose;
在按钮上添加:
这是一个错误。(有人在上面提到过这个)
如果这样做不起作用,还可以尝试将焦点从按钮上移开,并移到窗口框架上。