GTK子窗口点击右上角关闭后重新打开显示空白问题求助
GTK子窗口点击右上角关闭后重新打开空白的解决办法
问题根源
点击子窗口右上角的关闭按钮会触发destroy事件,GTK默认行为是销毁窗口及其内部所有部件。虽然你绑定了Close函数调用Hide(),但默认的销毁行为依然会执行,导致后续调用Show()时,窗口部件已经不存在,所以显示空白。而子窗口内的按钮直接调用Hide(),不会触发destroy事件的默认销毁逻辑,因此重新打开正常。
解决步骤
1. 在Glade中设置Hide on Destroy
这是最直接的方式,让destroy事件只隐藏窗口而非销毁:
- 打开
layout.glade,选中子窗口window2 - 切换到右侧的Properties面板
- 找到Behavior(行为)分组
- 勾选
Hide on Destroy选项
如果你的Glade版本找不到该选项,可以手动修改XML文件,在window2的属性中添加一行:
<property name="hide-on-destroy">True</property>
修改后的完整Glade代码:
<?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.18.3 --> <interface> <requires lib="gtk+" version="3.12"/> <object class="GtkWindow" id="window1"> <property name="can_focus">False</property> <signal name="destroy" handler="Quit" swapped="no"/> <child> <object class="GtkButton" id="button1"> <property name="label">gtk-open</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> <signal name="clicked" handler="ShowInfo" swapped="no"/> </object> </child> </object> <object class="GtkWindow" id="window2"> <property name="can_focus">False</property> <property name="hide-on-destroy">True</property> <signal name="destroy" handler="Close" swapped="no"/> <child> <object class="GtkButton" id="button2"> <property name="label">gtk-close</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> <signal name="clicked" handler="Close" swapped="no"/> </object> </child> </object> </interface>
2. 修正C#代码中的事件参数
你的Close函数当前使用EventArgs作为参数,但destroy事件的实际参数是DestroyEventArgs,需要修改参数类型并阻止默认行为(可选,但更严谨):
void Close(object o, DestroyEventArgs args) { Console.WriteLine("close"); Widget window = (Widget)builder.GetObject("window2"); window.Hide(); // 阻止GTK执行默认的销毁逻辑 args.RetVal = true; }
验证
完成上述设置后,点击子窗口右上角关闭按钮,再通过主窗口按钮重新打开,子窗口就能正常显示内部控件了。
内容的提问来源于stack exchange,提问作者Voidsay
相关产品推荐
相关产品推荐

