2012-01-09 27 views
8

Tôi phải thực hiện một điều khiển giống như người quản lý, thực hiện một số hành động, khi chuột di chuyển nó và thực hiện một hành động khác khi nó rời khỏi nút, nhưng không làm gì khi chuột di chuyển.Làm cách nào để thực hiện nút Chuyển đổi qua lại?

Để làm cho nó rõ ràng, đó là không đủ để chỉ đơn giản là tìm hiểu xem chuột là trên một khu vực hay không, nhưng nó phải chạy một số mã chỉ khi chuột đi vào và rời khỏi khu vực. (rõ yêu cầu của Szabolcs)

Đáng buồn thay, các AutoAction tùy chọn Button cư xử khác nhau: nó không ngừng cố gắng để thực hiện các hành động khi chuột đang chuyển động bên trong đối tượng:

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

Mặt khác , một lệnh Mouseover đơn giản không thể thực hiện mã được thực thi mỗi khi chuột rời khỏi đối tượng:

in = out = 0; 
Mouseover[ 
Dynamic["out", (in++) &], 
Dynamic["in", (out++) &] 
] 
Dynamic[Column[{in, out}]] 

Tôi nghĩ rằng đối số thứ hai của Dynamic có thể được sử dụng để xác định các hành động bắt đầu và kết thúc cho một đối tượng Mouseover, nhưng cũng không thành công với cách tiếp cận này.

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

Bất kỳ ý tưởng nào?

+0

Bạn đang sử dụng khung nào, đặt nó vào câu hỏi của bạn bởi vì có thể có một số triển khai sẵn có hơn là viết một từ đầu – Noor

+0

@Noor Vui lòng xem các thẻ: [tag: mathematica]. Nó đã được đề cập. – Szabolcs

+0

Bạn có thể giải thích những gì bạn muốn sử dụng cho? Bạn có đơn giản chỉ cần tìm hiểu xem con chuột có ở trên một vùng hay không (doable), hoặc bạn phải chạy một số mã * chỉ * khi chuột vào (hoặc rời khỏi) vùng đó (tôi không biết làm thế nào để làm điều đó) – Szabolcs

Trả lời

10

Bạn có thể làm một cái gì đó như thế này:

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

Điều này không là để bọc khu vực mà bạn muốn đăng ký nhập cảnh vào một khu vực lớn hơn một chút bằng Pane. Cả khu vực bên trong và khu vực bên ngoài đều có EvenHandler ghi lại chuyển động của chuột. Bằng cách đặt PassEventsUp->False cho bên trong EventHandler, các sự kiện "MouseMoved" được chuyển đến bên ngoài EventHandler chỉ khi con trỏ chuột nằm ngoài vùng bên ngoài nhưng không phải trên khu vực bên trong.

+0

Giải pháp thanh lịch, tôi đã suy nghĩ cùng một dòng. Dường như có một vấn đề nhỏ với các chuyển động chuột rất nhanh không được đăng ký, nhưng tôi đoán nó cũng xảy ra với một Mouseover đơn giản. –

+0

Cảm ơn. Trong giải pháp của tôi, tôi đã chọn một lề 4 điểm xung quanh khu vực bên trong. Vì vị trí chuột được lấy mẫu ở một tốc độ nhất định (khoảng 20 lần mỗi giây nếu tôi nhớ chính xác) nó có thể xảy ra khi bạn bỏ qua phần lề này giữa hai lần lấy mẫu nếu bạn di chuyển chuột đủ nhanh. Việc tăng 'ImageMargins' trong mã ở trên sẽ giải quyết vấn đề này. – Heike

+0

Rất tuyệt! Điều này nên có trong tài liệu. – telefunkenvf14

Các vấn đề liên quan