2009-12-09 140 views
2

Iam面对这样的问题,我发现很难克服。在WinForms中,我得到了一个带有n个TabPages的TabControl。我想要扩展Ctrl + Tab/Ctrl + Shift + Tab切换。所以我写了一些代码,只要焦点在TabControl或窗体上就可以正常工作。当应用程序的焦点是TabPage的内部(例如放在TabPage内的按钮上),同时按下Ctrl + Tab,我的代码被忽略,TabControl自己跳到TabPage(避开我的代码)。C#TabControl在TabControl中切换

任何想法?

+0

你可以提供一些细节如何扩展切换? – 2009-12-09 10:26:47

+0

我添加了Form KeyUp/KeyDown的事件处理程序 – Piglet 2009-12-09 10:36:22

+0

和Form.KeyPreview = ...? – 2009-12-09 10:38:45

回答

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

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。