首页 文章

使用F#和Eto.Forms捕获箭头键

提问于
浏览
32

在Linux上使用F#和Eto.Forms,使用Gtk3后端 .

EDIT: Adding updates to this google groups thread . 我目前最好的理论是,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)
  // ...
  )

但是我遇到了这个问题:Up, Down, Left and Right arrow keys do not trigger KeyDown event

我无法弄清楚如何遵循那里提供的解决方案(覆盖 PreviewKeyDown 并设置 e.IsInputKey = true ) . 我尝试添加以下内容:

f.PreviewKeyDown.Add(fun e -> e.IsInputKey <- true)

但那只是抱怨 f.PreviewKeyDown 不存在 .


编辑:它可能是this Gtk#-specific issue而不是上面的那个

从版本0.15开始,Gtk#在将事件处理程序连接到信号时开始使用CONNECT_AFTER标志 . 这意味着事件处理程序直到默认信号处理程序之后才会运行,这意味着在事件处理程序运行时将更新窗口小部件 . 此更改的副作用是,在默认处理程序返回true以停止信号传播的情况下,将不会发出Gtk#事件 .


更多细节:如果我也按住修改键(例如,向上箭头),则 KeyDown 触发器和 e.Key 匹配 Keys.Up . 即使 KeyDown 没有, KeyUp 也始终触发 .

1 回答

  • 0

    处理完事件后,尝试在事件处理程序中返回false .

相关问题