You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:17:54