Devo disabilitare la modifica della messa a fuoco con le frecce sul modulo. C'è un modo semplice come farlo?Come disattivare la navigazione su WinForm con le frecce in C#?
Grazie
Devo disabilitare la modifica della messa a fuoco con le frecce sul modulo. C'è un modo semplice come farlo?Come disattivare la navigazione su WinForm con le frecce in C#?
Grazie
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;
}
}
È 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.
Tale approccio non sembra funzionare, non c'è e.Handled sulle PreviewKeyDownEventArgs – andynormancx
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. –
Sì, esiste nell'evento KeyDown, ma l'impostazione non è di aiuto, la navigazione è già avvenuta da quel punto. – andynormancx
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;
}
}
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;
}
}
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
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. –
Non ci avrei pensato, ma sembra funzionare completamente. (Il mio obiettivo era di disabilitare condizionalmente Enter, ma la stessa idea.) Grazie! – neminem