Как я могу отличить одинарный клик от двойного в .Net?

StackOverflow https://stackoverflow.com/questions/218555

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хочу переопределить OnMouseClick и OnMouseDoubleClick и выполнять различные действия в зависимости от того, какой стиль клика был использован.

Проблема в том, что OnMouseClick выполняется как для одиночного, так и для двойного щелчков, и вызывается перед OnMouseDoubleClick.

Я уверен, что это должно быть общим требованием, поэтому, думаю, я упускаю что-то довольно очевидное.Кто-нибудь может ввести меня в курс дела?

Отредактируйте, чтобы добавить:подсчет MouseEventArgs.Clicks не помогает.В случае двойного щелчка первый щелчок обрабатывается как один щелчок в OnMouseClick с помощью MouseEventArgs.Clicks == 1.

Отредактируйте, чтобы добавить:объекты представляют собой миниатюры изображений.Один щелчок должен включать и выключать выделение для экспорта.Двойной щелчок должен сделать миниатюру полноэкранной.Действия выбора и "активации" ортогональны.Это может указывать на основную проблему, связанную с этими двумя действиями...

Приветствия, Роб

Это было полезно?

Решение

Это происходит во всей Windows.Я не думаю, что они добавили что-то особенное для обработки этого в .Net.

Обычным средством решения этой проблемы является

  • a) просто сделайте что-нибудь с одним щелчком мыши вы хотели бы, чтобы это произошло до двойного щелкните, например, выберите.
  • б) если это не вариант, то при событии click запустите таймер.На отметке таймера выполните действие одним щелчком мыши.Если событие двойного щелчка произойдет первым, отключите таймер и выполните действие двойного щелчка.

Время, на которое вы устанавливаете время, должно быть равно времени двойного щелчка системы (которое пользователь может указать на панели управления).Это доступно из Системы.Windows.Формы.Системная информация.Время двойного щелчка.Полная информация содержится в MSDN, здесь

Другие советы

Проблема в том, что большинство объектов не реализуют и то, и другое.Несколько объектов, которые могут разумно выполнять разные действия для одиночного и двойного щелчков, обычно подходят для выполнения действия с одним щелчком мыши перед действием с двойным щелчком (выделите папку, затем откройте ее, введите фокус на адресной строке перед ее выбором и т.д.). Вероятно, единственным способом определить было бы подождать с одним щелчком некоторое время и отменить действие для одного щелчка, если обнаружен двойной щелчок.

Другим возможным решением является вызов функции OnMouseDoubleClick из OnMouseClick.Поскольку действие в OnMouseClick является двоичным переключателем, его повторный вызов приводит к возврату в одно и то же состояние.

Таким образом, когда пользователь дважды щелкает мышью, Windows вызывает OnMouseClick, затем OnMouseDoubleClick.OnMouseDoubleClick вызывает OnMouseClick (снова) для восстановления состояния, затем обрабатывает двойной щелчок.

Это кажется неудовлетворительным решением, но оно работает.

Использование таймера (для проглатывания первого клика при двойном клике) также неудовлетворительно и дополнительно усложняется обработкой пользовательских настроек скорости двойного клика.

Приветствия, Роб

Вы могли бы запустить таймер в обработчике событий OnMouseClick.

  • Если время ожидания таймера истекло (скажем, 300 мс), то предполагается выполнить один щелчок.

Ещё

  • Если другое событие OnMouseClick было сгенерировано до истечения времени ожидания, вы могли бы проверить положение щелчка по x и y, и если оно находится в определенном радиусе от первого щелчка, то активируйте функцию двойного щелчка.

В противном случае

  • Обработайте первый щелчок и повторно инициализируйте таймер для второго щелчка

ПРИМЕЧАНИЕ:Преимущество этой реализации состоит в том, что как временной интервал, так и радиус двойного щелчка могут быть настроены независимо от конфигурации системы, что позволяет импортировать s / w на несколько компьютеров/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top