2011-05-30 32 views
2

我的用户包含可以选择其他控件处理键盘输入(箭头键),我想实现导航了子控件用方向键的方式如何防止用户控件的形式在C#

的问题是,父controll截取箭头键并用它来滚动它的视图,我想避免的事情是什么。我想解决自己对控制内容的导航。

如何控制由箭头键引起的标准行为?

在此先感谢 MTH

+0

要么转发按键或设置主机面板上的某些属性忽略的事件。 – CodingBarfield 2011-05-30 14:43:48

回答

1

这通常是通过覆盖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 
    } 
3

您可以覆盖的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; 
    } 
+0

查看Hans Passant的答案 - 那也可以。虽然IsInputKey在UserControls中工作正常(只是测试了上面的示例) – 2011-05-30 15:05:51

+0

两个答案都解决了问题,但是使用ProcessCmdKey上的重写似乎更加正确,无论如何感谢! – MoreThanChaos 2011-05-30 15:30:22