2012-11-01 117 views
3

在Gtk#中,我可以为“摧毁”事件挂钩一个处理程序,但它永远不会被调用。这个应用程序不会打印任何东西Gtk文档说,只有在设置了特定标志时才会发送“destroy”事件,并且还表示该标志由Gdk自动设置。Gtk#摧毁事件

这是令人沮丧的,因为它基本上与原本正常工作的Gtk +代码相同。我怎么知道什么时候打电话Application.Quit(),除了听“摧毁”事件呢?

using System; 
using Gtk; 

public class MainWindow { 
    public static void Main(string[] args) 
    { 
     Application.Init(); 
     Window win = new Window("Test"); 
     win.Resize(200, 200); 
     win.DestroyEvent += new DestroyEventHandler(OnDestroy); 
     win.ShowAll(); 
     Application.Run(); 
    } 

    private static void OnDestroy(object o, DestroyEventArgs args) 
    { 
     Console.WriteLine("OnDestroy"); 
    } 
} 

P.S.我对“删除”事件不感兴趣。

+0

你为什么不对DELETE事件感兴趣? – ptomato

+0

@ptomato:Gtk文档:“如果用户请求顶层窗口关闭,则发出删除事件信号” - 我想知道窗口关闭的时间,而不是用户请求的时间。 –

回答

4

gtk-sharp包装程序安装自己的销毁事件处理程序,首先被调用并断开处理程序。然而它又提供了一个Destroyed事件。你可以这样使用,如下:

using System; 
using Gtk; 

public class MainWindow { 
    public static void Main(string[] args) 
    { 
     Application.Init(); 
     Window win = new Window("Test"); 
     win.Resize(200, 200); 
     win.Destroyed += new EventHandler(OnDestroy); 
     win.ShowAll(); 
     Application.Run(); 
    } 

    private static void OnDestroy(object o, EventArgs args) 
    { 
     Console.WriteLine("OnDestroy"); 
     Application.Quit(); 
    } 
} 
+0

好的,这可行,但现在问题在于它被记录在哪里。我在文档中看不到“已销毁”事件:http://docs.go-mono.com/?link=T%3aGtk.Widget%2fE –

+0

记录在案?它是开源的!大声笑。说真的,我花了一些时间在源代码中查找代码为什么不起作用。文档应该确实指出,尽管它[确实有](http://docs.go-mono.com/?link=E%3aGtk.Object.Destroyed)'Destroyed'事件(它从'Gtk.Object继承而来')。 – Jester