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

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.