为什么这段代码只能在一个实例中使用?

时间:2012-08-30 16:41:04

标签: c# winforms keydown hotkeys keypreview

我已将表单的KeyPreview属性设置为true

我已添加此代码:

private void PlatypusScheduleForm_KeyDown(object sender, KeyEventArgs e) 
{
  if (e.KeyCode == Keys.F9)
  {
    tabControlPlatypi.SelectedTab = tabPageDuckBill;
  }
  else if (e.KeyCode == Keys.F10)
  {
    tabControlPlatypi.SelectedTab = tabPagePlatypus;
  }
}

当我混搭 F10 时,它按预期工作;然而,mashing F9 什么也没做。

tabPageDuckBill是显示的设计时/默认tabPage。为什么 F10 会将我带到“其他”标签页,但 F9 则不会回到原来的那个?

2 个答案:

答案 0 :(得分:1)

我在过去遇到过同样的问题,即使从SelectedIndexChanged()事件中删除可疑代码后问题仍然存在。然后我使用了一种效果更好的不同技术。我没有使用表单KeyDown事件,而是覆盖了ProcessCmdKey事件,如下所示:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
  if (keyData == Keys.F9)
  {
    this.tabControl1.SelectedTab = tabPage1;
    return true;    
  }
  else if (keyData == Keys.F10)
  {
    this.tabControl1.SelectedTab = tabPage2;
    return true;
  }
  return base.ProcessCmdKey(ref msg, keyData);
}

答案 1 :(得分:1)

我发现如果我这样做了:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.F9)
  {
      tabControl1.SelectedTab = tabPage1;
      e.SuppressKeyPress = true;
  }
  else if (e.KeyCode == Keys.F10)
  {
      tabControl1.SelectedTab = tabPage2;
      e.SuppressKeyPress = true;
  }
}

它会来回切换就好了。但是,如果没有e.SuppressKeyPress = true;,它就表现出你提到的行为。