即使 TabStop 设置为 false,按钮也会获得焦点

问题描述 投票:0回答:1

在表单上我有 2 个标签和一个按钮。
我的游戏在其中一个标签中进行,但我遇到了问题。玩家使用“WASD”和箭头键玩这个游戏。但是,当玩家第一次使用箭头键时,焦点会放在 Button 上,并且用户无法再使用箭头键。这是很明显的,因为按下箭头键后按钮周围立即出现蓝色轮廓。

有什么办法可以防止这种情况发生吗?同时仍然可以用玩家的鼠标点击按钮?虽然这根本不难,但我想避免重新绑定控件。

我尝试将 Button 的

TabStop
属性更改为 false,更改
TabIndex
的顺序,不出所料也没有解决问题。

我知道是 Button 导致了问题,因为 Button 实际上是我的表单上唯一的可交互对象(传统意义上的?),说 Windows 表单不需要具有始终保持焦点的事物。

Google 搜索了这个问题,但我没有找到任何专门解决此问题的内容,感谢任何帮助!

c# winforms button
1个回答
0
投票

默认情况下可以选择按钮控制。
如果它是表单上唯一的控件,则该 UI 元素将成为 ActiveControl 并获得焦点。

如果您在表单中设置了

KeyPreview = true
,并且正在处理
PreviewKeyDown
,您将在第一个输入键上收到通知,然后唯一可聚焦的控件(您的按钮)将成为
ActiveControl

在这种情况下,导航键(例如光标键)、交互键(例如空格键)和助记符将被处理,其他键将被丢弃,您的 Form 将不会收到相关消息(至少不会收到 WM_KEYDOWN 和 WM_KEYUP)。

如果您不希望按钮控件吃掉按键,或者窃取其他控件的焦点(例如,用作虚拟键盘的按键时),我通常用自定义按钮替换标准按钮一个。 这个自定义按钮只是设置一个样式来阻止它获得焦点,同时保留所有其他功能:

public class ButtonNoFocus : Button { public ButtonNoFocus() { SetStyle(ControlStyles.Selectable, false); } }
如果您将此类添加到项目中(您可以将其添加到表单本身),然后在表单的设计器文件中将类型 

Button

 的所有实例替换为 
ButtonNoFocus
,您的 
PreviewKeyDown
 处理程序将再次工作

© www.soinside.com 2019 - 2024. All rights reserved.