Как сделать переключающую кнопку Mouseover? - PullRequest
8 голосов
/ 09 января 2012

Мне нужно сделать элемент управления, похожий на тоглер, который выполняет какое-то действие, когда мышь наводит на него, и выполняет другое действие, когда он покидает кнопку, но ничего не делает, когда мышь находится и движется.

Чтобы прояснить ситуацию, недостаточно просто узнать, находится ли мышь над областью или нет, но она должна выполнить некоторый код только , когда мышь входит в область и покидает ее. (уточнение запрошено Сабольчем)

К сожалению, опция AutoAction для Button ведет себя по-разному: она постоянно пытается выполнить действие , пока мышь движется внутри объекта:

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

Есть идеи?

1 Ответ

10 голосов
/ 09 января 2012

Вы можете сделать что-то вроде этого:

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, который регистрирует движения мыши.При установке PassEventsUp->False для внутреннего EventHandler события "MouseMoved" передаются на внешний EventHandler, только если указатель мыши находится над внешней областью, но не над внутренней областью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...