在Linux上使用F#和Eto.Forms,并带有Gtk3后端。
编辑:向 这个google组线程添加更新。我目前最好的理论是,Eto将keypress事件添加到其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 + up箭头),那么KeyDown触发器和e.Key确实匹配Keys.Up。而且,KeyUp总是触发,即使KeyDown不触发。
发布于 2018-12-18 19:00:43
在处理事件后,尝试在事件处理程序中返回false。
https://stackoverflow.com/questions/36965432
复制相似问题