我正在将WinForms
应用转换为GTK#
,我想在OnMouseDoubleClick
小部件上模拟GTK# DrawingArea
方法。
在WinForms
中,您可以覆盖两种方法,一种用于单击,另一种用于双击。如果WinForms
仅检测到一次点击,则只会调用OnMouseSingleClick
方法,如果检测到双击,则只会调用OnMouseDoubleClick
方法。
现在在GTK#中,您只能使用一种方法来覆盖点击OnButtonPressEvent
。如果单击,OnButtonPressEvent
只会调用一次,但如果双击,则会调用三次!这是因为GTK为每次点击发送一个信号,加上双击即可。
在这个网站上有类似的问题,但没有一个答案是关于我正在使用的小部件,或者答案不满意。所以我的问题是,如何使用WinForms
模拟OnMouseDoubleClick
GTK#
方法?
答案 0 :(得分:0)
GTK没有提供WinForms实现的行为,可能是因为它在真正的单击生效之前需要延迟。 (没有那个延迟,WinForms会在OnMouseSingleClick
之前发出至少一个虚假OnMouseDoubleClick
。当您使用单击重命名文件管理器中的文件时,此延迟非常明显,该文件管理器也使用双击打开文件。)
要自己实现它,您需要在伪代码中执行以下操作:
在您的班级中添加布尔wait
和无符号handlerId
成员。将wait
设为false。
当OnButtonPress
收到一次点击而wait
为false时:将wait
设为true并使用GLib.Timeout.Add
来安排OnWaitForDoubleClickTimeout
方法在延迟等于GTK双击间隔后运行。您可以从Gtk.Settings
获取双击间隔作为gtk-double-click-time
属性。将GLib.Timeout.Add
的返回值存储在handlerId
。
当OnButtonPress
收到单击并且wait
为真时:通过调用GLib.Source.Remove(handlerId)
取消超时,将wait
重置为false,否则忽略事件
当OnButtonPress
收到双击时:调用OnMouseDoubleClick()
。此时,由于#3,wait
应为假。
在OnWaitForDoubleClickTimeout
中,将wait
重置为false并调用OnMouseSingleClick
。最后,返回false
,以便相同的超时不会再次触发。