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