14

谁能指出为什么这在Mathematica 8 中不起作用:

DynamicModule[{x = Pink},
 Row[
  {Style["Hello", x],
   Mouseover[
    x = Green; "World",
    x = Blue; "World"]}]]

当我将鼠标悬停在“World”上时,我期望看到“Hello”的颜色发生变化。我得到的是一个永远不会改变颜色的粉红色“你好”。

4

5 回答 5

10

我想我已经等了足够长的时间来公平。这是我的建议:

DynamicModule[{x = Pink},
 Row[{
   Dynamic@Style["Hello", If[MouseAnnotation[] === 1, x = Green; Blue, x]],
   Annotation["World", 1, "Mouse"]
 }]
]
于 2011-11-30T01:51:13.553 回答
9

如果查看结果的 FullForm,您会发现它只包含每个复合指令集的最后一部分。显然 Mouseover 评估其参数并仅存储结果。

在此处输入图像描述

于 2011-11-29T22:51:54.670 回答
9

尝试EventHandler使用"MouseEntered"and "MouseExited"

DynamicModule[{c = Pink}, Row[{
 Style["Hello", FontColor -> Dynamic[c]], 
 EventHandler[
  "World", {
   "MouseEntered" :> (c = Blue), 
   "MouseExited" :> (c = Green)
}]}]]
于 2011-11-30T01:51:22.927 回答
7

快速检查显示,Mouseover当您第一次启动它时,它会评估其中的所有表达式:

Mouseover[Print["One"]; 1, Print["Two"]; 2]

Mouseover实际修改 x 值的惯用方法是使用MouseAnnotation. 向导先生的回答描述了如何实现这一点。

于 2011-11-29T22:52:41.860 回答
7

作为替代方案,您可以执行类似的操作

DynamicModule[{col = Pink}, 
 Row[{Style["Hello ", FontColor -> Dynamic[col]], 
   Dynamic@If[CurrentValue["MouseOver"],
     col = Green; "World", 
     col = col /. Green -> Blue; "World"]}]
] 
于 2011-11-29T22:54:14.827 回答