滚动窗口中的Gtk扩展器:滚动窗口的宽度不更新

本文关键字:滚动 窗口 更新 扩展器 Gtk | 更新日期: 2023-09-27 18:11:18

当使用水平策略Never的Gtk ScrolledWindow时,我希望ScrolledWindow能够适应,如果子窗口的水平大小请求发生变化。

但情况并非如此,例如当使用扩展器时:当我展开扩展器时,子窗口比滚动窗口更宽,滚动窗口不适应它的大小。

最低的例子:

using System;
using Gtk;
namespace ExpanderIssue
{
    class MainClass
    {
        static bool useExpander = true;
        private static Widget createScrolledWindow(Widget child)
        {
            ScrolledWindow scrolledWindow = new ScrolledWindow();
            scrolledWindow.SetPolicy(PolicyType.Never, PolicyType.Automatic);
            scrolledWindow.AddWithViewport(child);
            return scrolledWindow;
        }
        private static Widget createSingleExpaner(int index)
        {
            Button button = new Button(String.Format("ExampleButton {0}", index));
            button.WidthRequest = 800;
            if(useExpander) {
                Expander expander = new Expander(String.Format("Expander {0}", index));
                expander.Add(button);
                return expander;
            } else {
                return button;
            }
        }
        public static void Main(string[] args)
        {
            Application.Init();
            createMainWindow();
            Application.Run();
        }
        private static Window createMainWindow()
        {
            VBox vbox = new VBox();
            vbox.Spacing = 4;
            for(int i=0; i<32; ++i)
                vbox.PackStart(createSingleExpaner(i), false, false, 0);
            Window mainWindow = new Window("Expander Width Request issue");
            mainWindow.SetDefaultSize(240, 160);
            mainWindow.Add(createScrolledWindow(vbox));
            mainWindow.ShowAll();
            mainWindow.Destroyed += (sender, e) => Application.Quit();
            return mainWindow;
        }
    }
}

滚动窗口中的Gtk扩展器:滚动窗口的宽度不更新

尝试手动创建滚动条的视口,并在发送sizerequrequested Event from child时调整视口的宽度请求。

对于您的最小示例,它应该看起来像这样:

using System;
using Gtk;
namespace ExpanderIssue
{
    class MainClass
    {
        static bool useExpander = true;
        private static Widget createScrolledWindow(Widget child)
        {
            ScrolledWindow scrolledWindow = new ScrolledWindow();
            scrolledWindow.SetPolicy(PolicyType.Never, PolicyType.Automatic);
            scrolledWindow.Add(doWorkaround(child));
            return scrolledWindow;
        }
        private static Viewport doWorkaround(Widget child)
        {
            Viewport viewport = new Viewport();
            viewport.Add(child);
            child.SizeRequested += (o, args) =>
            {
                viewport.WidthRequest = viewport.Child.Requisition.Width;
            };
            return viewport;
        }

        private static Widget createSingleExpaner(int index)
        {
            Button button = new Button(String.Format("ExampleButton {0}", index));
            button.WidthRequest = 800;
            if(useExpander) {
                Expander expander = new Expander(String.Format("Expander {0}", index));
                expander.Add(button);
                return expander;
            } else {
                return button;
            }
        }
        public static void Main(string[] args)
        {
            Application.Init();
            createMainWindow();
            Application.Run();
        }
        private static Window createMainWindow()
        {
            VBox vbox = new VBox();
            vbox.Spacing = 4;
            for(int i=0; i<32; ++i)
                vbox.PackStart(createSingleExpaner(i), false, false, 0);
            Window mainWindow = new Window("Expander Width Request issue");
            mainWindow.SetDefaultSize(240, 160);
            mainWindow.Add(createScrolledWindow(vbox));
            mainWindow.ShowAll();
            mainWindow.Destroyed += (sender, e) => Application.Quit();
            return mainWindow;
        }
    }
}