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

34

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

编辑:此 Google Groups 线程 中有更新。我目前的最佳理论是 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#的问题,而不是上面的问题

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


更多细节:如果我同时按住修饰键(例如Shift + 上箭头),那么KeyDown触发,并且e.KeyKeys.Up匹配。即使KeyDown不触发,KeyUp也总是触发。


2
要进行重写,您需要从表单类继承。 - John Palmer
也不起作用;看起来 Eto.Forms 没有暴露那个事件 :( - Martin DeMello
它在Eto.WPF后端上运行良好。您遇到了哪个版本的问题? - jpe
PreviewKeyDown.AddSystem.Windows.Forms 表单中可用,但在 Eto.Forms 中不可用。这个问题是持续存在的还是偶尔会丢失箭头键?您正在使用哪个 Eto 后端(GTK2、GTK3、WPF 等)? - jpe
使用gtk3后端,它是持久的 - 只有在同时按下修饰键时,箭头键才会注册。一些其他键,如空格和制表符也不会注册,这让我想知道是否有一些默认的表单导航键被应用程序层吞噬了。 - Martin DeMello
同时,当我释放箭头键时,KeyUp事件会被触发,即使在我按下它时并没有触发KeyDown事件。 - Martin DeMello
1个回答

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

问题在于某些内部处理程序正在执行此操作,因此我的事件处理程序从未被调用。 - Martin DeMello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接