2009-12-09 5 views
2

Iam face à ce problème, que je trouve difficile à surmonter. Dans WinForms j'ai obtenu un TabControl avec n TabPages. Je veux étendre la commutation Ctrl + Tab/Ctrl + Maj + Tab. J'ai donc écrit du code qui fonctionne bien tant que le focus est sur TabControl ou sur le formulaire. Lorsque le focus de l'application est INSIDE sur TabPage (par exemple sur un bouton placé dans TabPage), tout en appuyant sur Ctrl + Tab, mon code est ignoré et TabControl passe à TabPage lui-même (en évitant mon code).C# Tab commutation dans TabControl

Une idée?

+0

Pouvez-vous donner des détails sur la façon dont vous avez prolongé la commutation? –

+0

Ive a ajouté un gestionnaire d'événements pour Form KeyUp/KeyDown – Piglet

+0

Et Form.KeyPreview = ...? –

Répondre

4

Vous devez dériver de TabControl et remplacer ProcessCmdKey, méthode virtuelle afin de remplacer le comportement Ctrl-Tab.

Exemple:

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 a un traitement assez inhabituel pour gérer la touche Tab. Il remplace la méthode ProcessKeyPreview() pour détecter Ctrl/Shift/Tab, puis implémente la sélection d'onglet dans sa méthode OnKeyDown(). Il le fait afin qu'il puisse détecter la frappe à la fois lorsqu'il a le focus lui-même ainsi que tout contrôle enfant. Et pour éviter de traiter le traitement des touches de tabulation personnalisé par l'un de ses contrôles enfants. Vous pouvez le faire en remplaçant ProcessCmdKey(), mais vous cassez les contrôles enfants qui veulent répondre aux onglets.

La meilleure chose à faire est de surcharger sa méthode OnKeyDown(). Ajoutez une nouvelle classe à votre projet et collez le code ci-dessous. Compiler. Déposez le nouveau contrôle onglet du haut de la boîte à outils sur votre formulaire.

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); 
    } 
} 

Attention, vous devez également prendre en compte Ctrl + PageUp et Ctrl + PageDown.