如何制作切换鼠标悬停按钮?

时间:2012-01-09 15:15:43

标签: user-interface wolfram-mathematica

我必须制作一个类似toggler的控件,当鼠标移过它时会执行一些操作,并在它离开按钮时执行另一个操作,但在鼠标结束并移动时不执行任何操作。

为了说清楚,仅仅找出鼠标是否在一个区域之上是不够的,但当鼠标进入和离开时,它必须只运行一些代码 区域。(Szabolcs要求澄清)

可悲的是,AutoAction的{​​{1}}选项的行为有所不同:当鼠标在对象内移动时,它会不断尝试执行操作:

Button

另一方面,简单的switch = False; Button["Hover", switch = ! switch, AutoAction -> True] Dynamic[switch] 命令无法执行每次鼠标离开对象时执行的代码:

Mouseover

我认为in = out = 0; Mouseover[ Dynamic["out", (in++) &], Dynamic["in", (out++) &] ] Dynamic[Column[{in, out}]] 的第二个参数可用于定义Dynamic对象的起始和结束动作,但这种方法也没有成功。

Mouseover

有什么想法吗?

1 个答案:

答案 0 :(得分:10)

你可以这样做:

in = 0; out = 0;
Dynamic[Column[{in, out}]]
Module[{over = False},
 EventHandler[
  Pane[EventHandler[Dynamic[Framed[Pane[If[over, "In", "Out"], 40]]],
     {"MouseMoved" :> If[Not[over], over = True; in++]},
     PassEventsUp -> False], ImageMargins -> 4],
  {"MouseMoved" :> If[over, over = False; out++]}]]

这样做是使用Pane将要注册条目和退出的区域包装到稍大的区域。内部区域和外部区域都具有EvenHandler,其记录鼠标的移动。通过为内部PassEventsUp->False设置EventHandler,仅当鼠标指针位于外部区域上方但未覆盖内部区域时,"MouseMoved"事件才会传递到外部EventHandler