2010-11-01 5 views
2

J'ai reçu un formulaire avec un certain nombre de boutons (supposons 20). Au milieu, j'ai un User Control qui est complètement vide. La question est: comment puis-je faire en sorte que lorsque le contrôle de l'utilisateur est cliqué, il va se concentrer sur le clavier?UserControl Keyboard Focus

Raison: Je peins des formes dans ce contrôle utilisateur, avec ma souris. Les formes sont en fait d'autres contrôles utilisateur. Ce que je veux faire, c'est pouvoir utiliser le clavier pour déplacer ces formes. Mais je n'arrive pas à saisir correctement le focus du clavier. Les événements Key_Down n'atteignent pas mon contrôle utilisateur principal. En d'autres termes, comment pouvons-nous avoir la mise au point du clavier dans un contrôle qui n'a pas d'éléments à focaliser dessus? Comment peut-on faire un contrôle non focalisable au clavier, attraper ces événements? Toute façon d'attraper ces événements à l'échelle de la fenêtre, autre que d'aller brut-API WIN32 hardcore?

Répondre

6

Un UserControl a été conçu pour être un contrôle de conteneur pour d'autres contrôles. Il a horreur de se concentrer et tente de le faire passer la première occasion. Vous ne devriez pas utiliser un UserControl ici, étant donné que vous n'y mettez aucun contrôle. Un contrôle de panneau suffira. Qui a exactement le même problème, il ne veut pas se concentrer non plus.

Une intervention chirurgicale est nécessaire pour neutraliser son comportement. Tout ce dont vous avez besoin est au this answer.

+0

Bonjour Hans et merci d'avoir répondu :: -). J'ajoute des contrôles dedans. Autres contrôles utilisateur. Et j'ai utilisé un contrôle utilisateur (pas un panneau) parce que je suis tout-peinture personnalisée. J'ai examiné votre réponse dans l'autre fil. Des trucs géniaux. Vous avez un score élevé pour une bonne raison :: -). +2. – Axonn

1

Ajouter à votre code de contrôle de l'utilisateur pour capturer l'entrée du clavier:

/// <summary>Keys which can generate OnKeyDown event.</summary> 
    private static readonly Keys[] InputKeys = new [] 
     { Keys.Left, Keys.Up, Keys.Right, Keys.Down, }; 

    protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e) 
    { 
     if(Array.IndexOf<Keys>(InputKeys, e.KeyCode) != -1) 
     { 
      e.IsInputKey = true; 
     } 
     base.OnPreviewKeyDown(e); 
    } 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     base.OnKeyDown(e); 
     // just to illustrate this works 
     MessageBox.Show("KeyDown: " + e.KeyCode); 
    } 
+0

Cool, merci de répondre! :: - D. +1. – Axonn

0

Vous devez définir l'indicateur CommandRouting sur votre contrôle sur true. La propriété de dépendance de routage de commande est définie dans une API publique (MS.VS.Editor.dll) et votre décor voudra utiliser cette API pour indiquer qu'il gère ses commandes au lieu de permettre à la vue de texte qui les contient de les gérer. Vous pouvez le faire avec l'initialisation de votre contrôle. Microsoft.VisualStudio.Editor.CommandRouting.SetInterceptsCommandRouting (this, true);