在Linux上使用F#和Eto.Forms,使用Gtk3后端。
编辑:向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#事件将不会 射出。
更多细节:如果我同时按住修改键(例如shift +向上箭头),则KeyDown
触发器和e.Key
匹配Keys.Up
。此外,KeyUp
始终会触发,即使KeyDown
没有。
答案 0 :(得分:0)
尝试处理事件后,在事件处理程序中返回false。