【问题标题】:How to Close a Gtk# Window Programmatically?如何以编程方式关闭 Gtk# 窗口?
【发布时间】:2013-01-13 16:34:53
【问题描述】:

我正在尝试通过单击按钮关闭代码中的 Gtk# Window。即该按钮应与标题栏中的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 都建议在 this forum 中关闭 Gtk 窗口。 The selected answer in this SO post 也建议 Destroy,甚至声称在调用该方法时会触发 delete 事件。但是,我无法重现该主张;所有上述方法只会使窗口消失,但只有在我使用 X 标题栏按钮关闭窗口时才会触发 DeleteEvent

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

【问题讨论】:

  • 投反对票的原因,好吗?

标签: gtk#


【解决方案1】:

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

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

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

【讨论】:

  • 窗口没有可用的Event() 方法,但是在浏览文档一段时间后,我想调用ProcessEvent(Gdk.EventHelper.New(Gdk.EventType.Delete)) 是要走的路。这似乎触发了DeleteEvent,但窗口并未关闭以响应该事件 - 如果ProcessEvent 返回false,我仍然必须自己调用win.Destroy();win.Hide();。这是正确的吗?
  • 你是对的,看起来gtk_widget_event() 方法在 C# 中没有等效方法。
  • 但是 DeleteEvent 的默认处理程序应该关闭窗口。
  • 看到gtk_widget_event()的文档文本与Widget.ProcessEvent()的文档几乎一模一样,我现在确定后者确实是前者的Gtk#等价物。
  • 测试时,在我看来,Gtk# 中的DeleteEvent 没有默认处理程序。发出事件的唯一效果似乎是触发了DeleteEvent 事件,并且ProcessEvent 的返回值是根据RetValDeleteEvent 注册的事件处理程序中写入的内容设置的。
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 2011-08-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多