Подтвердить что ты не робот

Захват клавиш со стрелками с F # и Eto.Forms

Использование 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 нет.

4b9b3361

Ответ 1

Попробуйте вернуть false в обработчик события после того, как обработали событие.