Ist*_*har 8 user-interface wolfram-mathematica
我必须做一个类似toggler的控件,当鼠标移过它时执行一些动作,当它离开按钮时执行另一个动作,但是当鼠标结束并移动时什么都不做.
为了说清楚,仅仅找出鼠标是否在某个区域上是不够的,但只有在鼠标进入和离开该区域时它才能运行一些代码.(Szabolcs要求澄清)
遗憾的是,行为的AutoAction
选择Button
不同:当鼠标在对象内部移动时,它会不断尝试执行操作:
switch = False;
Button["Hover", switch = ! switch, AutoAction -> True]
Dynamic[switch]
Run Code Online (Sandbox Code Playgroud)
另一方面,一个简单的Mouseover
命令无法执行每次鼠标离开对象时执行的代码:
in = out = 0;
Mouseover[
Dynamic["out", (in++) &],
Dynamic["in", (out++) &]
]
Dynamic[Column[{in, out}]]
Run Code Online (Sandbox Code Playgroud)
我认为第二个参数Dynamic
可以用来定义一个Mouseover
对象的起始和结束动作,但这种方法也没有成功.
start = end = False;
Dynamic[Mouseover["out", "in"], {(start = True) &, Null, (end = True) &}]
Dynamic[Column[{start, end}]]
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Hei*_*ike 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++]}]]
Run Code Online (Sandbox Code Playgroud)
这样做是为了将要注册条目和退出的区域包装成稍大的区域Pane
.内部区域和外部区域都具有EvenHandler
记录鼠标移动的区域.通过设置PassEventsUp->False
内部EventHandler
,仅当鼠标指针位于外部区域上方而不是内部区域上方时,"MouseMoved"
事件才会传递到外部EventHandler
.