我试图通过点击按钮关闭代码中的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();
在this forum中建议使用Hide
和Destroy
来关闭Gtk窗口。 The selected answer in this SO post也建议使用Destroy
,甚至声称在调用该方法时会触发delete
事件。但是,我不能重现这种说法;所有上述方法只会使窗口消失,但只有在我用DeleteEvent
标题栏按钮关闭窗口时才会触发X
。
换句话说,您可以说我正在寻找与Windows Forms / WPF Close()
方法等效的Gtk#。调用这些完全模拟点击X
标题栏按钮,因为相应的Closing
事件被触发,并且仍有机会阻止表单/窗口被关闭。
答案 0 :(得分:2)
你是对的,只有当窗口管理器试图关闭窗口时才触发删除事件(即用户点击X按钮。)
您可以使用Destroy
关闭窗口。我不是100%肯定,但我认为这会触发DestroyEvent
。
但是,如果您想要完全模拟单击X按钮,则需要使用DeleteEvent
发送window.Event()
。