2009-12-09 148 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。