Вручение двойного щелчка в GTK#

Я конвертирую WinForms приложение к GTK# и я хочу смоделировать OnMouseDoubleClick метод на GTK# DrawingArea виджет.

В WinFormsУ вас есть два метода, которые вы можете переопределить, один для одного клика и один для двойного клика. Если WinForms обнаруживает только один клик, он только вызывает OnMouseSingleClick метод, и если он обнаруживает двойной щелчок, он вызывает только OnMouseDoubleClick метод.

Теперь в GTK# у вас есть только один метод, который вы можете переопределить для нажатия, OnButtonPressEvent, Если вы нажмете один раз, OnButtonPressEvent вызывается только один раз, но если дважды щелкнуть мышью, он вызывается три раза! Это потому, что GTK посылает сигнал для каждого клика, плюс один для двойного клика.

На этом сайте есть похожие вопросы, но ни один из ответов не касался используемого мной виджета, или ответы не были удовлетворительными. Итак, мой вопрос опять же, как мне симулировать WinFormsOnMouseDoubleClick метод с GTK#?

1 ответ

Решение

GTK не предлагает поведение, реализованное WinForms, вероятно, потому что это влечет за собой задержку, прежде чем подлинный единственный щелчок вступит в силу. (Без этой задержки WinForms будет излучать хотя бы один поддельный OnMouseSingleClick до OnMouseDoubleClick, Эта задержка очень заметна, когда вы используете один щелчок, чтобы переименовать файл в файловом менеджере, который также использует двойной щелчок, чтобы открыть файл.)

Чтобы реализовать это самостоятельно, вам нужно сделать следующее в псевдокоде:

  1. Добавить логическое значение wait и неподписанный handlerId член вашего класса. Задавать wait ложно.

  2. когда OnButtonPress получает один клик и wait ложно: Установить wait правда и использовать GLib.Timeout.Add запланировать OnWaitForDoubleClickTimeout метод для запуска после задержки, равной интервалу двойного щелчка GTK. Вы можете получить интервал двойного щелчка как gtk-double-click-time собственность от Gtk.Settings, Сохранить возвращаемое значение GLib.Timeout.Add в handlerId,

  3. когда OnButtonPress получает один клик и wait верно: отмените тайм-аут, позвонив GLib.Source.Remove(handlerId), сброс wait ложно, и в противном случае игнорировать событие.

  4. когда OnButtonPress получает двойной щелчок: Invoke OnMouseDoubleClick(), На данный момент, из-за № 3, wait должно быть ложным.

  5. В OnWaitForDoubleClickTimeout, сброс wait ложно и ссылаться OnMouseSingleClick, Наконец, вернитесь false поэтому тот же тайм-аут не срабатывает снова.

Другие вопросы по тегам