.net - Capturando teclas de flecha con F#y Eto.Forms
gtk3 (0)
Usando F # y Eto.Forms en Linux, con el backend Gtk3.
EDITAR: Agregar actualizaciones a este hilo de grupos de Google . Mi mejor teoría actual es que la forma en que Eto agrega eventos de pulsación de teclas a un widget en su back-end de Gtk no le permite capturar eventos antes de que un controlador predeterminado los maneje y detenga la propagación de la señal.
Estoy tratando de capturar eventos de KeyDown en una forma:
let f = new Form(Topmost=true, ClientSize = new Size(600, 480))
f.KeyDown.Add(fun e ->
match e.Key with
| Keys.Up -> cursor.Move(Move_Up)
// ...
)
pero me encuentro con este problema: las teclas de flecha arriba, abajo, izquierda y derecha no activan el evento KeyDown
No puedo averiguar cómo seguir la solución provista allí (anular PreviewKeyDown
y establecer e.IsInputKey = true
). Intenté agregar lo siguiente:
f.PreviewKeyDown.Add(fun e -> e.IsInputKey <- true)
pero eso solo se quejó de que f.PreviewKeyDown
no existía.
EDITAR: podría ser este problema específico de Gtk # en lugar del anterior
A partir de la versión 0.15, Gtk # comenzó a usar el indicador CONNECT_AFTER al conectar los controladores de eventos a las señales. Esto significa que los controladores de eventos no se ejecutan hasta después de los controladores de señal predeterminados, lo que significa que el widget se actualizará cuando se ejecuten los controladores de eventos. Un efecto secundario de este cambio es que, en el caso de que los controladores predeterminados devuelvan verdadero para detener la propagación de la señal, no se emitirán los eventos Gtk #.
Más detalles: si también KeyDown
una tecla modificadora (por ejemplo, shift + flecha arriba), entonces KeyDown
dispara y e.Key
coincide con Keys.Up
También KeyUp
siempre se dispara, incluso cuando KeyDown
no lo hace.