2009-08-23 3 views

Antwort

15

Etwas entlang der Linien von:

private void Form1_Load(object sender, EventArgs e) 
    { 
     foreach (Control control in this.Controls) 
     { 
      control.PreviewKeyDown += new PreviewKeyDownEventHandler(control_PreviewKeyDown); 
     } 
    } 

    void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right) 
     { 
      e.IsInputKey = true; 
     } 
    } 
+0

Funktioniert perfekt. Vielen Dank! Nur kurze Notiz für andere Leute: foreach (Steuerelemente in this.Controls) enthält nicht alle Steuerelemente - Sie können Container (z. B. system.windows.forms.panel) in Form haben. –

+0

Hätte ich nicht gedacht, aber das scheint völlig zu funktionieren. (Mein Ziel war es, Enter zu deaktivieren, aber die gleiche Idee.) Danke! – neminem

1

Sie KeyPreview auf true auf dem Formblatt sollte. Behandeln Sie das Ereignis KeyDown/KeyUp/KeyPress, und setzen Sie im Eventhandler die e.Handled für die Schlüssel, die ignoriert werden sollen, auf "true".

+0

Dieser Ansatz scheint nicht zu funktionieren, gibt es keine e.Handled auf den PreviewKeyDownEventArgs ist – andynormancx

+0

e.Handled existiert, aber in der Methode: private void Form1_KeyUp (object sender, KeyEventArgs e), KeyDown usw. Ich habe Probleme mit diesem Ansatz auch. Ich werde es auf sauberes Projekt versuchen. –

+0

Ja, es existiert im Ereignis KeyDown, aber die Einstellung hilft nicht, die Navigation ist bereits an diesem Punkt passiert. – andynormancx

2

Ich habe mit dem Code, unter dem Setzen Sie die Funktion zu jeder Steuerung auf Form ende:

(Der Code auf dem einen von andynormancx basieren)



private void Form1_Load(object sender, EventArgs e) 
{ 
    SetFeatureToAllControls(this.Controls);  
} 

private void SetFeatureToAllControls(Control.ControlCollection cc) 
{ 
    if (cc != null) 
    { 
     foreach (Control control in cc) 
     { 
      control.PreviewKeyDown += new PreviewKeyDownEventHandler(control_PreviewKeyDown); 
      SetFeatureToAllControls(control.Controls); 
     } 
    } 
} 

void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right) 
    { 
     e.IsInputKey = true; 
    } 
} 
1

Ich habe diesen Ansatz probiert, wo das Formular das Vorschau-Ereignis einmal behandelt. Es generiert weniger Code als die anderen Optionen.

Fügen Sie diese Methode einfach zum PreviewKeyDown-Ereignis Ihres Formulars hinzu, und legen Sie die -Eigenschaft auf true fest.

private void form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    switch (e.KeyCode) 
    { 
     case Keys.Up: 
     case Keys.Down: 
     case Keys.Left: 
     case Keys.Right: 
      e.IsInputKey = true; 
      break; 
     default: 
      break; 
    } 
} 
+0

Hallo Carlos. Ich wollte Ihre kürzere Version verwenden, aber als ich sie getestet habe, hat sie leider nicht das gemacht, was sie eigentlich sein sollte (und ich habe daran gedacht, 'Form.KeyPreview = true' natürlich zu setzen). Nur wenn ich foreach() in Form_Load hinzugefügt habe, hat sich das Verhalten geändert. Hast du es getestet? – spaceman

Verwandte Themen