我必须制作一个类似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
有什么想法吗?
答案 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
。