使用 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.Key
与Keys.Up
匹配。即使KeyDown
不触发,KeyUp
也总是触发。
PreviewKeyDown.Add
在System.Windows.Forms
表单中可用,但在Eto.Forms
中不可用。这个问题是持续存在的还是偶尔会丢失箭头键?您正在使用哪个 Eto 后端(GTK2、GTK3、WPF 等)? - jpe