在官方的微软文档中,只有一个段落提到了控件如何响应键盘(至少我所能找到的):
http://msdn.microsoft.com/en-us/library/cc189015(v=VS.95).aspx#inputting_text
文本输入和控件
某些控件会对键盘事件做出自己的反应。例如,TextBox 是一个控件,旨在捕获并可视化使用键盘输入的文本,并在其自身逻辑中使用 KeyUp 和 KeyDown 捕获按键,如果文本实际发生更改,则还会引发自己的 TextChanged 事件。您仍然可以向 TextBox 或任何相关控件添加 KeyUp 和 KeyDown 处理程序,以处理文本输入。但是,作为其预期设计的一部分,控件可能不会响应通过键事件传递给它的所有键值。行为针对每个控件具体而言。例如,ButtonBase(Button 的基类)处理 KeyUp,以便它可以检查 SPACEBAR 或 ENTER 键,将其视为鼠标左键按下,以便触发 Click 事件。此事件的处理是通过 ButtonBase 覆盖虚拟方法 OnKeyUp 来完成的,在其实现中设置 Handled = true。结果是,任何父按钮都无法接收到已处理过的 SPACEBAR 键事件,以供其自己的处理程序使用。另一个例子是 TextBox。一些键,如 ARROW 键,被 TextBox 视为非文本内容,而是被视为特定于控件 UI 行为的内容,因此 TextBox 将这些事件情况标记为已处理。
自定义控件可以通过覆盖 OnKeyDown / OnKeyUp 来实现其自己的类似重写行为,以响应键事件。如果您的自定义控件处理特定的加速键或具有类似于 TextBox 的控制或焦点行为的情况,则应将此逻辑放在您自己的 OnKeyDown / OnKeyUp 覆盖中。
是否有更完整的参考资料?
例如,在AutoCompleteBox中,您可以按上/下箭头导航到建议,并按Enter键选择其中一个等等。当然,肯定有比专注于每个控件并按下键盘上的每个键来查找更好的方法 :)