我的用户包含可以选择其他控件处理键盘输入(箭头键),我想实现导航了子控件用方向键的方式如何防止用户控件的形式在C#
的问题是,父controll截取箭头键并用它来滚动它的视图,我想避免的事情是什么。我想解决自己对控制内容的导航。
如何控制由箭头键引起的标准行为?
在此先感谢 MTH
我的用户包含可以选择其他控件处理键盘输入(箭头键),我想实现导航了子控件用方向键的方式如何防止用户控件的形式在C#
的问题是,父controll截取箭头键并用它来滚动它的视图,我想避免的事情是什么。我想解决自己对控制内容的导航。
如何控制由箭头键引起的标准行为?
在此先感谢 MTH
这通常是通过覆盖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;
}
查看Hans Passant的答案 - 那也可以。虽然IsInputKey在UserControls中工作正常(只是测试了上面的示例) – 2011-05-30 15:05:51
两个答案都解决了问题,但是使用ProcessCmdKey上的重写似乎更加正确,无论如何感谢! – MoreThanChaos 2011-05-30 15:30:22
要么转发按键或设置主机面板上的某些属性忽略的事件。 – CodingBarfield 2011-05-30 14:43:48