wxHaskell 按钮状态
wxHaskell Button State
我正在使用 wxHaskell 编写一个应用程序,我希望能够检测按钮的状态(无论它是否在任何给定时间被按下)。但是,我在弄清楚如何执行此操作时遇到了一些麻烦。起初我认为可能有一个 "button is pressed" 属性可以使用,但似乎没有。然后我有了维护一个 IORef
的想法,我在按下按钮和按下按钮事件时更新它。但是,这需要 Button
对象实际上 具有 按钮弹起和按钮按下事件,而这似乎没有。它是 Commanding
的一个实例,但我假设 command
事件仅在按下按钮时触发,这对于这个想法来说是不够的。有没有人有任何其他建议?
解决方法
您可以通过检测触发这些事件的低级别操作(例如,鼠标按钮按下、space 条按下)来自行实现。
在WX中你可以使用下面的函数和构造函数:
mouse :: Reactive w => Event w (EventMouse -> IO ())
data EventMouse = ... | MouseLeftDown !Point !Modifiers
而且,正如您所建议的,您可以自己将状态保持在 IORef
中。我怀疑这里的左键意味着 main 按钮(左撇子用户的右键)。
UI设计原则
第二个问题,你还没有问过,我会回答,这是否是好的 UI 设计。
按钮的行为(假设使用鼠标交互)是当用户在按钮区域释放鼠标按钮时报告点击事件 =41=] 在同一区域按下鼠标按钮后。如果用户移开并松开,或按下 'Escape',则没有点击。
在按下(而不是单击)按钮上执行任何操作都会让用户感觉不自然。
在实践中,恕我直言,唯一可以接受的使用方法是采取一个行动,其效果 只能 在释放后被见证并且立即 undone 如果单击被取消(即鼠标按钮在按钮区域外释放)。
编辑:另外,请考虑具有可访问性要求的用户可能启用了 OS 设置,这些设置会影响报告按钮点击的方式和时间(但不down/up 鼠标事件)。
没有办法知道 wxButton
是否被按下,因为它是一个按钮的抽象,有意隐藏了这个实现细节。如果您需要知道按钮状态,请改用 wxToggleButton。
我正在使用 wxHaskell 编写一个应用程序,我希望能够检测按钮的状态(无论它是否在任何给定时间被按下)。但是,我在弄清楚如何执行此操作时遇到了一些麻烦。起初我认为可能有一个 "button is pressed" 属性可以使用,但似乎没有。然后我有了维护一个 IORef
的想法,我在按下按钮和按下按钮事件时更新它。但是,这需要 Button
对象实际上 具有 按钮弹起和按钮按下事件,而这似乎没有。它是 Commanding
的一个实例,但我假设 command
事件仅在按下按钮时触发,这对于这个想法来说是不够的。有没有人有任何其他建议?
解决方法
您可以通过检测触发这些事件的低级别操作(例如,鼠标按钮按下、space 条按下)来自行实现。
在WX中你可以使用下面的函数和构造函数:
mouse :: Reactive w => Event w (EventMouse -> IO ())
data EventMouse = ... | MouseLeftDown !Point !Modifiers
而且,正如您所建议的,您可以自己将状态保持在 IORef
中。我怀疑这里的左键意味着 main 按钮(左撇子用户的右键)。
UI设计原则
第二个问题,你还没有问过,我会回答,这是否是好的 UI 设计。
按钮的行为(假设使用鼠标交互)是当用户在按钮区域释放鼠标按钮时报告点击事件 =41=] 在同一区域按下鼠标按钮后。如果用户移开并松开,或按下 'Escape',则没有点击。
在按下(而不是单击)按钮上执行任何操作都会让用户感觉不自然。
在实践中,恕我直言,唯一可以接受的使用方法是采取一个行动,其效果 只能 在释放后被见证并且立即 undone 如果单击被取消(即鼠标按钮在按钮区域外释放)。
编辑:另外,请考虑具有可访问性要求的用户可能启用了 OS 设置,这些设置会影响报告按钮点击的方式和时间(但不down/up 鼠标事件)。
没有办法知道 wxButton
是否被按下,因为它是一个按钮的抽象,有意隐藏了这个实现细节。如果您需要知道按钮状态,请改用 wxToggleButton。