2

我试图Window通过单击一个按钮来关闭代码中的 Gtk#。也就是说,按钮应该与X标题栏中的按钮具有相同的效果。

然而,当窗口关闭DeleteEvent时,单击我自己的按钮时不会触发,而不是单击X标题栏按钮。

这是一些最小的示例代码:

    using System;

    using Gtk;

    namespace GtkSharpTest
    {
        class Program
        {
            [STAThread]
            public static void Main(string[] args)
            {
                Application.Init();

                using (Window win = new Window("Test")) {
                    win.SetSizeRequest(300, 200);
                    win.Hidden += delegate(object sender, EventArgs e) {
                        Application.Quit();
                    };
                    win.DeleteEvent += delegate(object o, DeleteEventArgs e) {
                        using (MessageDialog dlg = new MessageDialog(win,
                                                                     DialogFlags.Modal,
                                                                     MessageType.Question,
                                                                     ButtonsType.YesNo,
                                                                     "Really close?")) {
                            ResponseType result = (ResponseType)dlg.Run();
                            dlg.Destroy();
                            if (result == ResponseType.No) {
                                e.RetVal = true;
                            }
                        }
                    };

                    Button bClose = Button.NewWithLabel("Close");
                    bClose.Clicked += delegate(object sender, EventArgs e) {
                        // ???
                    };
                    win.Add(bClose);

                    win.ShowAll();
                    Application.Run();
                }
            }
        }
    }

我正在寻找的行标有// ???

我在那里尝试了各种电话:

  • win.Hide();
  • win.HideAll();
  • win.Destroy();

两者都在这个论坛HideDestroy被建议关闭 Gtk 窗口。这篇 SO 帖子中的选定答案也暗示了,甚至声称在调用该方法时会触发该事件。但是,我无法重现该主张;所有上述方法只会使窗口消失,但只有当我使用标题栏按钮关闭窗口时才会触发。DestroydeleteDeleteEventX

换句话说,您可以说我正在寻找与 Windows 窗体/WPFClose()方法等效的 Gtk#。调用这些完全模拟了对X标题栏按钮的单击,因为相应的Closing事件被触发并且仍然有机会阻止表单/窗口被关闭。

4

1 回答 1

2

你是对的,删除事件仅在窗口管理器尝试关闭窗口时触发(即用户单击 X 按钮。)

您可以使用Destroy来关闭一个窗口。我不是 100% 确定,但我认为这会触发DestroyEvent.

但是,如果您想精确模拟单击 X 按钮,则需要发送一个DeleteEventwith window.Event()

于 2013-01-14T12:56:08.107 回答