TabControl中的C#Tab切换

时间:2009-12-09 10:24:05

标签: c# controls tabcontrol tabs

我面临着这样的问题,我觉得很难克服。在WinForms中,我得到了一个带有n个TabPages的TabControl。我想扩展Ctrl + Tab / Ctrl + Shift + Tab切换。所以我写了一些代码,只要焦点在TabControl或Form上,它就能正常工作。当应用程序焦点位于TabPage的INSIDE中时(例如放在TabPage内的按钮上),在按下Ctrl + Tab的同时,我的代码被忽略,TabControl自己跳到TabPage(避免我的代码)。

有人想过吗?

2 个答案:

答案 0 :(得分:4)

您需要从TabControl派生并重写ProcessCmdKey,虚方法以覆盖Ctrl-Tab行为。

示例:

public class ExtendedTabControl: TabControl
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.Tab))
        {
            // Write custom logic here
            return true;
        }
        if (keyData == (Keys.Control | Keys.Shift | Keys.Tab))
        {
            // Write custom logic here, for backward switching
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

答案 1 :(得分:2)

TabControl处理Tab键的处理相当不寻常。它会覆盖ProcessKeyPreview()方法以检测Ctrl / Shift / Tab,然后在其OnKeyDown()方法中实现选项卡选择。它这样做是因为它可以在它具有焦点本身以及任何子控件时检测击键。并避免通过其中一个子控件踩踏自定义Tab键处理。您可以通过重写ProcessCmdKey()使其工作,但是您将破坏想要响应选项卡的子控件。

最好的办法是覆盖它的OnKeyDown()方法。在项目中添加一个新类并粘贴下面显示的代码。编译。将新选项卡控件从工具箱顶部拖放到表单上。

using System;
using System.Windows.Forms;

class MyTabControl : TabControl {
  protected override void OnKeyDown(KeyEventArgs e) {
    if (e.KeyCode == Keys.Tab && (e.KeyData & Keys.Control) != Keys.None) {
      bool forward = (e.KeyData & Keys.Shift) == Keys.None;
      // Do your stuff
      //...
    }
    else base.OnKeyDown(e);
  }
}

请注意,您还应该考虑Ctrl + PageUp和Ctrl + PageDown。