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

Mar*_*llo 36 .net f# gtk3 eto

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

编辑:添加此谷歌组线程的更新.我目前最好的理论是,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)
  // ...
  )
Run Code Online (Sandbox Code Playgroud)

但我遇到了这个问题: 向上,向下,向左和向右箭头键不会触发KeyDown事件

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

f.PreviewKeyDown.Add(fun e -> e.IsInputKey <- true)
Run Code Online (Sandbox Code Playgroud)

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


编辑:这可能是这个Gtk#特定问题,而不是上面的问题

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


更多细节:如果我同时按住修改键(例如shift +向上箭头),则KeyDown触发并e.Key匹配Keys.Up.也KeyUp总是触发,即使KeyDown没有.

小智 1

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