2009-08-23 21 views

Respuesta

15

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

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

+0

No habría pensado en eso, pero parece funcionar completamente. (Mi objetivo era desactivar condicionalmente Enter, pero la misma idea). ¡Gracias! – neminem

1

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.

+0

Este enfoque no parece funcionar, no hay e.Handled en los PreviewKeyDownEventArgs existe – andynormancx

+0

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

+0

Sí, existe en el evento KeyDown, pero establecerlo no ayuda, la navegación ya ha sucedido en ese punto. – andynormancx

2

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

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

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

Cuestiones relacionadas