C#Winforms复选框未指示焦点

如果复选框是Tab键顺序(0)中的第一个控件,则表示在显示表单时它没有焦点。 事实上,它确实有焦点,您可以通过按空格键来检查/取消选中控件来演示。 如果选项卡然后按住shift键返回复选框,标签将标出轮廓以指示焦点。 通过创建带有复选框,文本框和按钮控件的新表单,可轻松测试。 Tab键顺序设置为该顺序。 启动表格。 没有迹象表明该复选框具有焦点。 通过控件选项卡,当您返回文本框时,它将被概述。 我尝试使用Control.Focus()和Control.Select()以Load和Shown方法的forms以编程方式设置焦点。

如何在启动表单时使复选框显示为焦点?

这是标准行为。 正如您所指出的那样,由于控件是Tab键顺序中的第一个控件并且可以获得焦点,因此在首次显示表单时实际上会对焦。

问题是, 自Windows 2000以来,默认情况下隐藏了焦点矩形和带下划线的助记符 。 在您使用键盘界面开始与程序交互之前,它们不会显示。 只需按Alt键即可显示它们。 所以实际上是使用TabShift + Tab

这个想法是减少Windows中的视觉噪音,即在菜单和窗口中聚焦指示器和访问键下划线。 在美学上,这些东西令人分心和恐惧。 从function上讲,它们仅在您通过键盘导航时才有用。 当您刚刚使用鼠标时,它们不会增加显着的价值。 事实上,它们往往是多余的。

为什么现在? 每件好事都必须从某个地方开始。 Windows看起来更干净,更简单。

[…]

当然,当用户进行键盘导航演示时,键盘指示灯将会返回。 指标会出现并适当消失。 最后,如果您根本不喜欢该行为,可以从“显示”控制面板中禁用它。

所以你没有做错任何事。 SelectFocus或等效的程序化使用不会使焦点矩形显示出来。 控件已经集中。

你可能只做两件事:

  1. 更改系统设置,以便始终显示焦点指示。 由于这是一个全局设置,它应该只由最终用户操纵,而不是由您的应用程序操纵。 因此,无需调用API函数来执行此操作,只需访问控制面板即可。

  2. 覆盖控件的绘制行为并强制它绘制焦点指示器,无论系统认为它应该做什么。 您可以通过完全所有者绘制控件来完成此操作,但是使用此控件类可能更容易:

     public class ForcedFocusCheckBox : CheckBox { protected override bool ShowFocusCues { get { return true; } } } 

但老实说,你不应该做这些事情。 这是一个标准的平台惯例。 所有内置对话框都会发生同样的事情。 如果用户还不知道,他或她可能没有做太多的键盘交互,他们也不会期望按空格键来切换您的复选框。 他们只会使用鼠标。