在GTK中双击双击#

时间:2014-10-26 10:44:29

标签: c# winforms user-interface gtk gtk#

我正在将WinForms应用转换为GTK#,我想在OnMouseDoubleClick小部件上模拟GTK# DrawingArea方法。

WinForms中,您可以覆盖两种方法,一种用于单击,另一种用于双击。如果WinForms仅检测到一次点击,则只会调用OnMouseSingleClick方法,如果检测到双击,则只会调用OnMouseDoubleClick方法。

现在在GTK#中,您只能使用一种方法来覆盖点击OnButtonPressEvent。如果单击,OnButtonPressEvent只会调用一次,但如果双击,则会调用三次!这是因为GTK为每次点击发送一个信号,加上双击即可。

在这个网站上有类似的问题,但没有一个答案是关于我正在使用的小部件,或者答案不满意。所以我的问题是,如何使用WinForms模拟OnMouseDoubleClick GTK#方法?

1 个答案:

答案 0 :(得分:0)

GTK没有提供WinForms实现的行为,可能是因为它在真正的单击生效之前需要延迟。 (没有那个延迟,WinForms会在OnMouseSingleClick之前发出至少一个虚假OnMouseDoubleClick。当您使用单击重命名文件管理器中的文件时,此延迟非常明显,该文件管理器也使用双击打开文件。)

要自己实现它,您需要在伪代码中执行以下操作:

  1. 在您的班级中添加布尔wait和无符号handlerId成员。将wait设为false。

  2. OnButtonPress收到一次点击而wait为false时:将wait设为true并使用GLib.Timeout.Add来安排OnWaitForDoubleClickTimeout方法在延迟等于GTK双击间隔后运行。您可以从Gtk.Settings获取双击间隔作为gtk-double-click-time属性。将GLib.Timeout.Add的返回值存储在handlerId

  3. OnButtonPress收到单击并且wait为真时:通过调用GLib.Source.Remove(handlerId)取消超时,将wait重置为false,否则忽略事件

  4. OnButtonPress收到双击时:调用OnMouseDoubleClick()。此时,由于#3,wait应为假。

  5. OnWaitForDoubleClickTimeout中,将wait重置为false并调用OnMouseSingleClick。最后,返回false,以便相同的超时不会再次触发。