Как я могу дифференцироваться между единственным и двойными щелчками в .NET?

Согласно https://docs.python.org/2.7/library/stdtypes.html#set-types-set-frozenset ,

Объект множества неупорядоченная коллекция различных хеш-объектов.

blockquote>

Согласно https://docs.python.org/2.7/glossary.html#term-hashable ,

Объект является хэшируемым, если он имеет хеш-значение, которое никогда не изменяется в течение срока его службы (для него требуется метод __hash__()), и его можно сравнивать с другими объектами (для него требуется метод __eq__() или __cmp__()).

blockquote>

У вас есть __eq__, поэтому все, что вам сейчас нужно, это __hash__. (__ne__ также должно быть реализовано, или вы получите результаты, где x == y не соответствует not (x != y).)

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        if isinstance(other, Point):
            return self.x == other.x and self.y == other.y
        return NotImplemented

    def __ne__(self, other)
        if isinstance(other, Point):
            return not (self == other)
        return NotImplemented

    def __hash__(self):
        return hash((self.x, self.y))


print(set([Point(1,2), Point(1,2)]))

Результат:

set([<__main__.Point object at 0x02F4F090>])

Для стиля точки, вы также можете захотеть реализовать __repr__, поэтому ваш объект set выглядит красиво. Добавьте в def __repr__(self): return "Point({}, {})".format(self.x, self.y), и ваш набор будет отображаться как set([Point(1, 2)]).

8
задан Rob 20 October 2008 в 15:23
поделиться

4 ответа

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

Нормальное средство обработки этого

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

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

12
ответ дан 5 December 2019 в 15:28
поделиться

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

0
ответ дан 5 December 2019 в 15:28
поделиться

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

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

Это чувствует себя неудовлетворяющим как решение, но оно работает.

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

С наилучшими пожеланиями, ограбьте

0
ответ дан 5 December 2019 в 15:28
поделиться

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

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

Еще

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

Иначе

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

NB: Эта реализация имеет преимущество того, что и timeoput и радиус 'двойного щелчка' могут быть настроены независимо конфигурации системы, позволяющей s/w быть импортированным на несколько машин /

-1
ответ дан 5 December 2019 в 15:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: