首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用F#和Eto.Forms捕获箭头键

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

Stack Overflow用户
提问于 2016-05-01 10:09:14
回答 1查看 854关注 0票数 34

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

编辑:向 这个google组线程添加更新。我目前最好的理论是,Eto将keypress事件添加到其Gtk后端的小部件中的方式不允许在默认处理程序处理事件并阻止信号进一步传播之前捕获事件。

我试图以一种形式捕捉KeyDown事件:

代码语言:javascript
复制
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)。我尝试添加以下内容:

代码语言:javascript
复制
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不触发。

EN

回答 1

Stack Overflow用户

发布于 2018-12-18 19:00:43

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36965432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档