Использование F # и Eto.Forms в Linux с бэкэндом Gtk3.
РЕДАКТИРОВАТЬ: Добавление обновлений в эту ветку групп Google. Моя лучшая теория состоит в том, что способ, которым Eto добавляет события нажатия клавиш в виджет в его бэкэнде Gtk, не позволяет вам захватывать события до того, как обработчик по умолчанию обрабатывает их и останавливает дальнейшее распространение сигнала.
Я пытаюсь захватить события KeyDown в форме:
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)
// ...
)
но я сталкиваюсь с этой проблемой: клавиши со стрелками вверх, вниз, влево и вправо не вызывают событие KeyDown
Я не могу понять, как следовать предложенному там решению (переопределить PreviewKeyDown
и установить e.IsInputKey = true
). Я попытался добавить следующее:
f.PreviewKeyDown.Add(fun e -> e.IsInputKey <- true)
но тот просто пожаловался, что f.PreviewKeyDown
не существует.
РЕДАКТИРОВАТЬ: Это может быть проблема Gtk # -specific, а не выше
Начиная с версии 0.15, Gtk # начал использовать флаг CONNECT_AFTER при подключении обработчиков событий к сигналам. Это означает, что обработчики событий не запускаются до окончания обработчиков сигналов по умолчанию, что означает, что виджет будет обновляться при запуске обработчиков событий. Побочным эффектом этого изменения является то, что в случае, когда обработчики по умолчанию возвращают значение true, чтобы остановить распространение сигнала, события Gtk # не будут генерироваться.
Дополнительная информация: если я также удерживаю клавишу-модификатор (например, Shift + стрелка вверх), то KeyDown
срабатывает, и e.Key
соответствует Keys.Up
Кроме того, KeyUp
всегда срабатывает, даже когда KeyDown
нет.