我正在使用 wxHaskell 编写应用程序,并且我希望能够检测按钮的状态(无论在任何给定时间是否按下它)。但是,我在弄清楚如何做到这一点时遇到了一些麻烦。首先,我认为可能有一个我可以使用的“按钮被按下”属性,但似乎没有。然后我有了维护一个IORef
我更新按钮向上和按钮向下事件的想法。但是,这将要求Button
对象实际上具有按钮向上和按钮向下事件,而这似乎没有。它是 的一个实例Commanding
,但我假设该command
事件仅在按下按钮时触发,这对于该想法来说是不够的。有没有人有任何其他建议?
问问题
70 次
2 回答
1
解决方法
您可以通过检测触发这些事件的低级操作(例如,按下鼠标按钮、按下空格键)自己实现这一点。
在 WX 中,您可以使用以下函数和构造函数:
mouse :: Reactive w => Event w (EventMouse -> IO ())
data EventMouse = ... | MouseLeftDown !Point !Modifiers
而且,正如您所建议的,您可以自己将状态保持在IORef
. 我怀疑这里的左按钮是指主按钮(左撇子用户的右按钮)。
界面设计原则
第二个问题,你没有问过我来回答,这是否是好的 UI 设计。
按钮的行为(假设使用鼠标进行交互)是当用户在同一区域按下鼠标按钮后释放按钮区域的鼠标按钮时报告单击事件。如果用户离开并释放,或者按下“Escape”,则没有点击。
对按下(未单击)的按钮执行任何操作会让用户感觉不自然。
在实践中,唯一可接受的使用方法是,恕我直言,采取一个动作,其效果只能在释放后才能看到,如果单击被取消(即鼠标按钮在按钮区域外释放),该动作会立即撤消。
编辑:另外,请考虑到具有可访问性要求的用户可能启用了操作系统设置,这些设置会影响报告按钮点击的方式和时间(但不会影响向下/向上鼠标事件)。
于 2016-04-24T05:12:52.623 回答
0
没有办法知道 awxButton
是否被按下,因为它是一个按钮的抽象,它有意隐藏了这个实现细节。如果您需要知道按钮状态,请改用wxToggleButton。
于 2016-04-24T14:50:02.050 回答