Necesito desactivar el cambio de foco con flechas en el formulario. ¿Hay alguna manera fácil de hacerlo?Cómo deshabilitar la navegación en WinForm con las flechas en C#?
Gracias
Necesito desactivar el cambio de foco con flechas en el formulario. ¿Hay alguna manera fácil de hacerlo?Cómo deshabilitar la navegación en WinForm con las flechas en C#?
Gracias
Algo a lo largo de las líneas de:
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;
}
}
Debe establecer KeyPreview
true en el formulario. Controle el evento KeyDown/KeyUp/KeyPress
y configure e.Handled
en el manejador de eventos en true para las claves que desea ignorar.
Este enfoque no parece funcionar, no hay e.Handled en los PreviewKeyDownEventArgs existe – andynormancx
e.Handled pero en el método: void Form1_KeyUp (object sender, KeyEventArgs e) privada, etc. KeyDown tengo problemas con este enfoque también. Lo intentaré en un proyecto limpio. –
Sí, existe en el evento KeyDown, pero establecerlo no ayuda, la navegación ya ha sucedido en ese punto. – andynormancx
he terminado con el código debajo de la cual establecer la función de cada control en forma:
(El código se basa en el de 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;
}
}
Probé este enfoque, donde el formulario maneja el evento de vista previa una vez. Genera menos código que las otras opciones.
Simplemente agregue este método al evento PreviewKeyDown
de su formulario y establezca la propiedad KeyPreview
en 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;
}
}
Hola carlos. Quería usar su versión más corta, pero cuando la probé, no hizo lo que debería, desafortunadamente ... (y sí recuerdo establecer 'Form.KeyPreview = true' por supuesto). Solo cuando agregué el foreach() en Form_Load, el comportamiento cambió ... ¿Lo has probado? – spaceman
Funciona perfecto. ¡Gracias! Nota breve para otras personas: foreach (Control control en this.Controls) no contiene todos los controles: puede tener contenedores (por ejemplo, system.windows.forms.panel) en el formulario. –
No habría pensado en eso, pero parece funcionar completamente. (Mi objetivo era desactivar condicionalmente Enter, pero la misma idea). ¡Gracias! – neminem