Вручение двойного щелчка в GTK#
Я конвертирую WinForms
приложение к GTK#
и я хочу смоделировать OnMouseDoubleClick
метод на GTK# DrawingArea
виджет.
В WinForms
У вас есть два метода, которые вы можете переопределить, один для одного клика и один для двойного клика. Если WinForms
обнаруживает только один клик, он только вызывает OnMouseSingleClick
метод, и если он обнаруживает двойной щелчок, он вызывает только OnMouseDoubleClick
метод.
Теперь в GTK# у вас есть только один метод, который вы можете переопределить для нажатия, OnButtonPressEvent
, Если вы нажмете один раз, OnButtonPressEvent
вызывается только один раз, но если дважды щелкнуть мышью, он вызывается три раза! Это потому, что GTK посылает сигнал для каждого клика, плюс один для двойного клика.
На этом сайте есть похожие вопросы, но ни один из ответов не касался используемого мной виджета, или ответы не были удовлетворительными. Итак, мой вопрос опять же, как мне симулировать WinForms
OnMouseDoubleClick
метод с GTK#
?
1 ответ
GTK не предлагает поведение, реализованное WinForms, вероятно, потому что это влечет за собой задержку, прежде чем подлинный единственный щелчок вступит в силу. (Без этой задержки WinForms будет излучать хотя бы один поддельный OnMouseSingleClick
до OnMouseDoubleClick
, Эта задержка очень заметна, когда вы используете один щелчок, чтобы переименовать файл в файловом менеджере, который также использует двойной щелчок, чтобы открыть файл.)
Чтобы реализовать это самостоятельно, вам нужно сделать следующее в псевдокоде:
Добавить логическое значение
wait
и неподписанныйhandlerId
член вашего класса. Задаватьwait
ложно.когда
OnButtonPress
получает один клик иwait
ложно: Установитьwait
правда и использоватьGLib.Timeout.Add
запланироватьOnWaitForDoubleClickTimeout
метод для запуска после задержки, равной интервалу двойного щелчка GTK. Вы можете получить интервал двойного щелчка какgtk-double-click-time
собственность отGtk.Settings
, Сохранить возвращаемое значениеGLib.Timeout.Add
вhandlerId
,когда
OnButtonPress
получает один клик иwait
верно: отмените тайм-аут, позвонивGLib.Source.Remove(handlerId)
, сбросwait
ложно, и в противном случае игнорировать событие.когда
OnButtonPress
получает двойной щелчок: InvokeOnMouseDoubleClick()
, На данный момент, из-за № 3,wait
должно быть ложным.В
OnWaitForDoubleClickTimeout
, сбросwait
ложно и ссылатьсяOnMouseSingleClick
, Наконец, вернитесьfalse
поэтому тот же тайм-аут не срабатывает снова.