User interface 如何制作鼠标切换按钮?

User interface 如何制作鼠标切换按钮?,user-interface,wolfram-mathematica,User Interface,Wolfram Mathematica,我必须制作一个类似于开关的控件,当鼠标经过它时,它会执行一些动作,当它离开按钮时,它会执行另一个动作,但当鼠标经过并移动时,它什么也不做 为了清楚起见,仅仅知道鼠标是否在某个区域上是不够的,但是只有当鼠标进入和离开该区域时,它才能运行一些代码。(Szabolcs要求澄清) 遗憾的是,按钮的自动操作选项的行为不同:当鼠标在对象内部移动时,它不断尝试执行操作: switch = False; Button["Hover", switch = ! switch, AutoAction -> Tr

我必须制作一个类似于开关的控件,当鼠标经过它时,它会执行一些动作,当它离开按钮时,它会执行另一个动作,但当鼠标经过并移动时,它什么也不做

为了清楚起见,仅仅知道鼠标是否在某个区域上是不够的,但是只有当鼠标进入和离开该区域时,它才能运行一些代码。(Szabolcs要求澄清)

遗憾的是,
按钮的
自动操作
选项的行为不同:当鼠标在对象内部移动时,它不断尝试执行操作:

switch = False;
Button["Hover", switch = ! switch, AutoAction -> True]
Dynamic[switch]
in = out = 0;
Mouseover[
 Dynamic["out", (in++) &],
 Dynamic["in", (out++) &]
 ]
Dynamic[Column[{in, out}]]
另一方面,简单的
Mouseover
命令无法执行每次鼠标离开对象时执行的代码:

switch = False;
Button["Hover", switch = ! switch, AutoAction -> True]
Dynamic[switch]
in = out = 0;
Mouseover[
 Dynamic["out", (in++) &],
 Dynamic["in", (out++) &]
 ]
Dynamic[Column[{in, out}]]
我认为
Dynamic
的第二个参数可以用来定义
Mouseover
对象的开始和结束操作,但这种方法也没有成功

start = end = False;
Dynamic[Mouseover["out", "in"], {(start = True) &, Null, (end = True) &}]
Dynamic[Column[{start, end}]]

有什么想法吗?

你可以这样做:

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++]}]]

这样做的目的是使用
窗格
将要注册其入口和出口的区域包装到稍大的区域中。内部区域和外部区域都有一个记录鼠标移动的
EvenHandler
。通过为内部
EventHandler
设置
PassEventsUp->False
,只有当鼠标指针位于外部区域而不是内部区域上方时,
“MouseMoved”
事件才会传递到外部
EventHandler

您使用的是哪一个框架,请将其放在您的问题中,因为可能已经有一些可用的实现,而不是编写一个scratch@Noor请查看标签:。已经提到了。你能解释一下你想用这个做什么吗?您是否只需要确定鼠标是否在某个区域上(可行),或者您必须仅在鼠标进入(或离开)该区域时运行一些代码(我不知道如何操作)请参见编辑,谢谢您的措辞。优雅的解决方案,我也在想同样的问题。似乎有一个很小的问题,非常快的鼠标移动没有被登记,但我想这也发生在一个简单的鼠标器。谢谢。在我的解决方案中,我在内部区域周围选择了一个4点的边距。由于鼠标位置是以一定的速度采样的(如果我没记错的话,大约每秒20次),如果鼠标移动得足够快,可能会跳过两次采样之间的这个间隔。在上面的代码中增加
ImageMargins
可以解决这个问题。我认为应该有一个线程专门处理Mathematica中未内置的控制元素,或者可能只处理文档中未包含的控制元素(例如,应用程序下的角度滑块已包含,但未内置)。