WinForm控件开发总结(十二) 让控件处理导航键2011-11-14 博客园 纶巾客最近真的真的太忙了,以至于一个多月都没哟更新我的blog。昨天晚上,一个网上的朋友看了我的 ToolBox的文章,问我一个问题,他说如何让ToolBox控件也能响应键盘操作,也就是用Up,down按键来选 择工具箱控件里的Item,他添加了键盘事件,但是不起作用。一开始做这个控件的时候也只是演示一下控 件的制作过程,只用了很短的时间做了一个,只考虑了用鼠标选取,没有考虑键盘操作,我想要添加键盘 操作无非重载KeyDown事件,针对Up,Down做一些响应就可以了。可是添加了重载了OnKeyDown事件后,结 果和那位朋友所说的一样,没有任何作用,我设了断点,调试了一下,发现KeyDown根本捕获不到Up, Down按键的点击,是什么原因呢,是不是忘记设控件的风格以便让它能够获得焦点?于是,我使用了语句 :SetStyle(ControlStyles.Selectable, true);依然没有效果,当我们在控件上按下Down键的时候,另 一个控件获得了焦点。这时Up,Down按钮只是起到了导航的作用就像Tab键一样。接下来,我在测试工程的窗体上放置了一个ListBox控件做一个对比,其实ToolBox和ListBox在界面表 现上有相似之处,就是都有子Item,并且在ListBox上点击Down是起作用的,ListBox并没有失去焦点,这 说明这时Up,Down按键没有成为导航键。我想Windows一定是对默认的导航键Up,Down,Left,Right有默认 的处理,除非你希望你的控件希望自己处理这些键。用反汇编工具看了一下ListBoxControl控件的源代码 ,发现一个有趣的函数:
protected override bool IsInputKey(Keys keyData){ if ((keyData & Keys.Alt) == Keys.Alt) { return false; } switch ((keyData & Keys.KeyCode)) { case Keys.Prior: case Keys.Next: case Keys.End: case Keys.Home: return true; } return base.IsInputKey(keyData);}