【发布时间】:2018-12-19 03:00:43
【问题描述】:
在 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 没有触发。
【问题讨论】:
-
要覆盖你需要从表单类继承。
-
也没有用;看起来 Eto.Forms 只是没有公开该事件:(
-
它与 Eto.WPF 后端配合良好。您在使用哪个版本时遇到问题?
-
PreviewKeyDown.Add以System.Windows.Forms形式提供,但在Eto.Forms中不可用。问题是持续存在还是您偶尔会丢失箭头键?您使用的是 Eto 的哪个后端(GTK2、GTK3、WPF、...)? -
使用 gtk3 后端,并且它是持久的 - 除非同时按下修饰符,否则箭头键不会注册。其他一些键(如空格和选项卡)也没有注册,这让我想知道是否有一些默认的表单导航键在应用程序级别被吞没。