2009-08-23 2 views

risposta

15

Qualcosa sulla falsariga di:

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

Funziona perfettamente. Grazie! Solo una breve nota per altre persone: foreach (Control control in this.Controls) non contiene tutti i controlli - potresti avere contenitori (ad es. System.windows.forms.panel) sul modulo. –

+0

Non ci avrei pensato, ma sembra funzionare completamente. (Il mio obiettivo era di disabilitare condizionalmente Enter, ma la stessa idea.) Grazie! – neminem

1

È necessario impostare KeyPreview true sul modulo. Gestire l'evento KeyDown/KeyUp/KeyPress e impostare lo e.Handled nel gestore eventi su true per le chiavi che si desidera ignorare.

+0

Tale approccio non sembra funzionare, non c'è e.Handled sulle PreviewKeyDownEventArgs – andynormancx

+0

e.Handled esiste ma nel metodo: private void Form1_KeyUp (object sender, KeyEventArgs e), TastoGiù ecc ho problemi con questo approccio anche. Ci proverò su un progetto pulito. –

+0

Sì, esiste nell'evento KeyDown, ma l'impostazione non è di aiuto, la navigazione è già avvenuta da quel punto. – andynormancx

2

ho finito con il codice di sotto del quale impostare la funzione per tutti i controlli sulla forma:

(Il codice è basato su quello da andynormancx



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

Ho provato questo approccio, in cui il modulo gestisce l'evento di anteprima una volta. Genera meno codice rispetto alle altre opzioni.

Aggiungere questo metodo all'evento PreviewKeyDown del modulo e impostare la proprietà KeyPreview su true.

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

Ciao carlos. Volevo usare la versione più breve, ma quando l'ho testata, non ha fatto quello che dovrebbe sfortunatamente .. (e mi sono ricordato di impostare 'Form.KeyPreview = true' ovviamente). Solo quando ho aggiunto il foreach() in Form_Load, il comportamento è cambiato. Lo hai provato? – spaceman