2012-01-09 66 views
8

我不得不做一個類似於切換器的控制,它在鼠標移過它時執行一些操作,當它離開按鈕時執行另一個操作,但在鼠標移動結束時不執行任何操作。如何製作切換鼠標懸停按鈕?

要清楚,這是不夠的,只是找出鼠標是否是在一個區域或沒有,但它必須運行一些代碼當鼠標進入和離開該區域唯一(由索博爾奇請求澄清)

不幸的是,的ButtonAutoAction選項的行爲是不同的:它不斷地嘗試執行動作鼠標對象內移動:

switch = False; 
Button["Hover", switch = ! switch, AutoAction -> True] 
Dynamic[switch] 

在另一方面,簡單的Mouseover命令不能執行每次鼠標離開對象時執行的代碼:

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

任何想法?

+0

你正在使用哪個框架,把它放在你的問題中,因爲可能有一些已經可用的實現,而不是從頭開始編寫一個 – Noor 2012-01-09 15:19:28

+0

@Noor請看標籤:[tag:mathematica]。它已經提到。 – Szabolcs 2012-01-09 15:23:26

+0

你能解釋一下你想用它做什麼嗎?你只需要找出鼠標是否在某個區域內(或可行),或者只有當鼠標進入(或離開)該區域時才能運行一些代碼*(我不知道該怎麼做) – Szabolcs 2012-01-09 15:35:32

回答

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

這樣做是包裝您要的入口和出口註冊到使用Pane稍大區域的區域。內部區域和外部區域都有註冊鼠標移動的EvenHandler。通過爲內部EventHandler設置PassEventsUp->False,僅當鼠標指針位於外部區域之上但不在內部區域之上時,纔會將"MouseMoved"事件傳遞到外部EventHandler

+0

優雅的解決方案,我一直在思考。似乎有一個很小的問題,非常快的鼠標移動沒有被註冊,但我想它也發生在一個簡單的鼠標移動。 – 2012-01-09 17:17:04

+0

謝謝。在我的解決方案中,我選擇了內部區域四分之一的邊距。由於鼠標位置是以特定速度採樣的(如果我沒有記錯的話,每秒鐘大約20次),如果您足夠快地移動鼠標,可能會發生兩次採樣之間跳過此邊距。在上面的代碼中增加'ImageMargins'應該解決這個問題。 – Heike 2012-01-09 20:54:00

+0

非常酷!這應該在文檔中。 – telefunkenvf14 2012-01-11 01:49:19