谁能指出为什么这在Mathematica 8 中不起作用:
DynamicModule[{x = Pink},
Row[
{Style["Hello", x],
Mouseover[
x = Green; "World",
x = Blue; "World"]}]]
当我将鼠标悬停在“World”上时,我期望看到“Hello”的颜色发生变化。我得到的是一个永远不会改变颜色的粉红色“你好”。
谁能指出为什么这在Mathematica 8 中不起作用:
DynamicModule[{x = Pink},
Row[
{Style["Hello", x],
Mouseover[
x = Green; "World",
x = Blue; "World"]}]]
当我将鼠标悬停在“World”上时,我期望看到“Hello”的颜色发生变化。我得到的是一个永远不会改变颜色的粉红色“你好”。
我想我已经等了足够长的时间来公平。这是我的建议:
DynamicModule[{x = Pink},
Row[{
Dynamic@Style["Hello", If[MouseAnnotation[] === 1, x = Green; Blue, x]],
Annotation["World", 1, "Mouse"]
}]
]
如果查看结果的 FullForm,您会发现它只包含每个复合指令集的最后一部分。显然 Mouseover 评估其参数并仅存储结果。
尝试EventHandler
使用"MouseEntered"
and "MouseExited"
:
DynamicModule[{c = Pink}, Row[{
Style["Hello", FontColor -> Dynamic[c]],
EventHandler[
"World", {
"MouseEntered" :> (c = Blue),
"MouseExited" :> (c = Green)
}]}]]
快速检查显示,Mouseover
当您第一次启动它时,它会评估其中的所有表达式:
Mouseover[Print["One"]; 1, Print["Two"]; 2]
Mouseover
实际修改 x 值的惯用方法是使用MouseAnnotation
. 向导先生的回答描述了如何实现这一点。
作为替代方案,您可以执行类似的操作
DynamicModule[{col = Pink},
Row[{Style["Hello ", FontColor -> Dynamic[col]],
Dynamic@If[CurrentValue["MouseOver"],
col = Green; "World",
col = col /. Green -> Blue; "World"]}]
]