J'ai un contrôle utilisateur avec plusieurs contrôles d'enfants. J'ai besoin de l'interface utilisateur pour réagir aux touches. J'ai donc décidé de mettre le code de traitement dans un événement MainControl_KeyDownDown. Cependant, lorsque j'appuie une clé de ma candidature, cet événement ne tire pas. P>
J'ai trouvé une solution via un moteur de recherche qui repose sur l'utilisation de l'API Windows, que je voudrais éviter, comme il ressemble à une overkill pour ce qui devrait être une fonction correctement prise en charge par le .NET. < / p>
7 Réponses :
Peut-être que vous devriez traiter tous les événements localement, puis incendiez des événements factices pour communiquer avec le contrôle principal? P>
ou peut-être que cela peut être une question de mise au point; S'il y a de nombreux contrôles d'enfants et qu'un seul d'entre eux est axé, les autres ne réagiraient pas à l'action de la clé. P>
Peut-être que vous pourriez poster des extraits de code ici pour être sûr. p>
Vous pouvez ajouter un gestionnaire d'événements de clé pour chaque contrôle de votre enfant dans votre contrôle de l'utilisateur et enflammer l'événement de la clé de votre utilisateur dans chacun, comme:
private void textBox1_KeyDown(object sender, KeyEventArgs e) { this.OnKeyDown(e); }
Voici un exemple que la boucle jette chaque contrôle sous la forme pour attacher l'événement de clé. C'est comme la réponse préventive dans ce post mais gérez plus de cas:
using Microsoft.VisualBasic; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; public class UserControlKeyboardProcessor { private void Control_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { base.OnKeyDown(e); } private void UserControlKeyboardProcessor_Disposed(object sender, System.EventArgs e) { foreach (System.Windows.Forms.Control control in this.GetAllControls(this)) { control.KeyDown -= Control_KeyDown; } } private void UserControlKeyboardProcessor_Load(object sender, System.EventArgs e) { foreach (System.Windows.Forms.Control control in this.GetAllControls(this)) { control.KeyDown += Control_KeyDown; } } public Generic.List<System.Windows.Forms.Control> GetAllControls(System.Windows.Forms.Control control) { Generic.List<System.Windows.Forms.Control> controls = new Generic.List<System.Windows.Forms.Control>(); foreach (System.Windows.Forms.Control subControl in control.Controls) { controls.Add(subControl); controls.AddRange(this.GetAllControls(subControl)); } return controls; } public UserControlKeyboardProcessor() { Load += UserControlKeyboardProcessor_Load; Disposed += UserControlKeyboardProcessor_Disposed; } }
Je sais que ce fil est un peu vieux, mais j'ai eu un problème similaire et le gérer de manière différente:
Dans la fenêtre principale, j'ai changé l'attribut KeyPreview sur True.
J'ai enregistré le gestionnaire de clé-événement de la fenêtre principale de mon contrôle utilisateur.
this.Parent.KeyDown += new KeyEventHandler(MyControl_KeyDown);
Cela fonctionne bien lorsqu'un contrôle est utilisé sous plusieurs formulaires et capture Entrée code> appelle une méthode dans le formulaire
J'ai une truc.
i fous ucbase code> hériter à partir de
usercontrol code> p>
ucsub1 code> et
ucsub2 < / code> hérit de
ucbase code>.
ucsuperclass code> hérit de
ucbase code> aussi. p>
ucsub1 code>,
ucsub2 code> Utilisation dans
ucsuperclass code>. p>
ucsub1 code> et
ucsub2 code> invoke
processcmdkey code>. p>
Vous pouvez ajouter Suivre Méthode à votre usercontrol code>:
Cela devrait être la réponse acceptée. Lorsque vous avez affaire à des contrôles imbriqués, etc. Tous les événements clés peuvent devenir velus. Cela fonctionne sans échec pour moi.
Depuis que vous êtes dans un UserControl, vous pouvez simplement remplacer la méthode onprevieweydown code> comme indiqué ci-dessous:
J'ai trouvé [cette réponse] [1] pour être la plus utile - vous remplacez le processusCMDKey (). [1]: Stackoverflow.com/a/1616965/327458
Ce lien devrait être la réponse.