10
votes

Capturer des événements clés dans un UserControl

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.

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>


2 commentaires

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.


7 Réponses :


1
votes

Peut-être que vous devriez traiter tous les événements localement, puis incendiez des événements factices pour communiquer avec le contrôle principal?

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é.

Peut-être que vous pourriez poster des extraits de code ici pour être sûr.


0 commentaires

8
votes

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


0 commentaires

1
votes

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


0 commentaires

9
votes

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


1 commentaires

Cela fonctionne bien lorsqu'un contrôle est utilisé sous plusieurs formulaires et capture Entrée appelle une méthode dans le formulaire



0
votes

J'ai une truc.

ucbase hériter à partir de usercontrol

ucsub1 et ucsub2 < / code> hérit de ucbase . ucsuperclass hérit de ucbase aussi.

ucsub1 , ucsub2 Utilisation dans ucsuperclass .

i fous ucsub1 et ucsub2 invoke processcmdkey .

Code: xxx


0 commentaires

17
votes

Vous pouvez ajouter Suivre Méthode à votre usercontrol : xxx


1 commentaires

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.



0
votes

Depuis que vous êtes dans un UserControl, vous pouvez simplement remplacer la méthode onprevieweydown comme indiqué ci-dessous: xxx


0 commentaires