【发布时间】:2011-09-04 20:28:53
【问题描述】:
我的用户控件包含可以选择的其他控件,我想实现使用箭头键导航子控件的方式
问题是父控件拦截箭头键并使用它来滚动其视图我想要避免的事情是什么。我想自己解决导航控制内容的问题。
如何控制由箭头键引起的标准行为?
提前致谢 第M个
【问题讨论】:
-
要么转发按键,要么在主机面板上设置一些属性以忽略事件。
标签: c# .net winforms user-controls keyboard
我的用户控件包含可以选择的其他控件,我想实现使用箭头键导航子控件的方式
问题是父控件拦截箭头键并使用它来滚动其视图我想要避免的事情是什么。我想自己解决导航控制内容的问题。
如何控制由箭头键引起的标准行为?
提前致谢 第M个
【问题讨论】:
标签: c# .net winforms user-controls keyboard
这通常通过重写 IsInputKey() 方法来告诉您需要这些键。但是,这不适用于 UserControl,它永远不会获得焦点,因此 OnKeyDown 方法永远不会运行。相反,重写 ProcessCmdKey() 方法,它在表单看到击键之前被调用。像这样:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
switch (keyData) {
case Keys.Left: MessageBox.Show("Left!"); break;
case Keys.Right: MessageBox.Show("Right!"); break;
default: return base.ProcessCmdKey(ref msg, keyData);
}
return true; // used
}
【讨论】:
您可以在用户控件中覆盖 OnKeyDown,但这不适用于箭头键,因为它们不是“输入键”(它们是导航键)。
要更改行为,请重写 IsInputKey() 以告诉系统您要获取箭头键的事件:
protected override bool IsInputKey(Keys keyData)
{
bool result = false;
Keys key = keyData & Keys.KeyCode;
switch (key)
{
case Keys.Up:
case Keys.Down:
case Keys.Right:
case Keys.Left:
result = true;
break;
default:
result = base.IsInputKey(keyData);
break;
}
return result;
}
【讨论】: