【问题标题】:How to correctly restore Gtk window size at program startup?如何在程序启动时正确恢复 Gtk 窗口大小?
【发布时间】:2011-10-19 15:51:28
【问题描述】:

我正在使用 GTK# GUI 框架在 C# 中编写应用程序以使其跨平台。 与 WPF/Windows.Forms 不同的是,在 GTK# 中完成了许多事情,但其中大部分事情我都能够自己解决。

有一个“小”问题,当我试图解决它时,它变得不那么“小”了。 当应用程序关闭时,我正在将窗口位置和最大化标志保存到配置文件。 但是当我尝试恢复窗口参数时,它们的恢复不正确。

我尝试使用的方法:

SetSizeRequest():

this.SetSizeRequest((int)config["windowwidth"], (int)config["windowheight"]);

SetDefaultSize():

this.SetDefaultSize((int)config["windowwidth"], (int)config["windowheight"]);

调整大小():

this.Resize((int)config["windowwidth"], (int)config["windowheight"]);

问题是: 其中一些方法根本不起作用(什么都不做)。其他人的行为很奇怪:将窗口大小设置为不是从配置中加载的,使窗口不断扩大,等等。

我还添加了一个特定小部件大小的约束:

Gdk.Geometry geom = new Gdk.Geometry();
geom.MinWidth = 800;
geom.MinHeight = 400;
this.SetGeometryHints(BoxNotebook, geom, Gdk.WindowHints.MinSize);

当我将所有这些一起使用时,它变得一团糟。 在程序启动时恢复窗口大小的正确方法是什么?

【问题讨论】:

    标签: c# gtk gtk#


    【解决方案1】:

    Resize 在我的应用程序中工作。您确定从配置文件中加载了正确的值吗?

    编辑

    这是一个 Glade 文件,似乎可以满足您的要求:

    <?xml version="1.0"?>
    <interface>
      <object class="GtkWindow" id="window">
        <child>
          <object class="GtkHPaned" id="hpaned">
            <child>
              <object class="GtkNotebook" id="notebook">
                <property name="width_request">300</property>
                <child>
                  <object class="GtkScrolledWindow" id="scrolledwindow">
                    <child>
                      <object class="GtkTreeView" id="treeview"/>
                    </child>
                  </object>
                </child>
                <child type="tab">
                  <object class="GtkLabel" id="label1">
                    <property name="label">300 px wide</property>
                  </object>
                  <packing>
                    <property name="tab_fill">False</property>
                  </packing>
                </child>
              </object>
              <packing>
                <property name="resize">True</property>
                <property name="shrink">False</property>
              </packing>
            </child>
            <child>
              <object class="GtkLabel" id="label2">
                <property name="width_request">400</property>
                <property name="label">400 px wide</property>
              </object>
              <packing>
                <property name="resize">False</property>
                <property name="shrink">False</property>
              </packing>
            </child>
          </object>
        </child>
      </object>
    </interface>
    

    【讨论】:

    • 好吧,在 Build() 调用之后,我在 Window 构造函数中执行此操作。可能这是错误的。可能我应该在某些 Window 信号处理程序中执行此操作吗?激活还是其他?
    • 好的,当我在调用 win.Show() 后从 Main() 调用它时,它对我有用;虽然,有时,当子小部件的请求很高时,窗口开始永远水平拉伸。有没有办法限制最大窗口宽度?我不喜欢窗口宽度超过屏幕宽度。
    • 我在我的窗口构造函数中也使用了Resize,它可以工作。也许你想把太多东西塞进窗户里?孩子的申请什么时候变得太大?可以通过在ScrolledWindows 中加入一些东西来解决吗?
    • 其实有这样的结构:HPaned in window;左侧窗格中的笔记本; Notebook 中的 ScrolledWindow;滚动窗口中的 ListView。我希望这款笔记本的宽度永远不会小于 300 像素,HPaned 的整个右窗格 - 小于 400 像素。我希望窗口可以调整大小,并且 HPaned 的右窗格在调整窗口大小时保持相同大小。似乎是不可能实现的。我制作了右窗格以保持其大小。我已经调整了窗口大小。但是当我添加描述的限制时,窗口变得不可调整大小。
    • 当我不添加限制时,如果调整窗口大小导致 Notebook 变得太小(小于 ListView 中一个图标的宽度),窗口开始永远扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多