堆叠小部件以在GTK中生成动态表单#

时间:2017-12-11 16:12:14

标签: .net scrollbar gtk#

现在我正在开发一个基于XML文件动态生成其小部件的.NET Mono GTK#应用程序。所以我需要将一堆小部件堆叠在另一个之下。我尝试使用VBox(因为我需要小部件水平拉伸)但我不希望小部件垂直拉伸。

void BuildObjectProperties(Container parent, List<ObjectProperty> objectProperties)
{
    var verticalBox = new VBox(false, 0);
    foreach (var objectProperty in objectProperties)
    {
        BuildObjectProperty(verticalBox, objectProperty);
    }
    parent.Add(verticalBox);
}

void BuildObjectProperty(Container parent, ObjectProperty objectProperty)
{
    switch (objectProperty.Type)
    {
        case PropertyType.Text:
            parent.Add(new Entry());
            break;
        case PropertyType.Number:
            parent.Add(new SpinButton(0,10,1));
            break;
        case PropertyType.Note:
            parent.Add(new TextView());
            break;
        case PropertyType.List:
            parent.Add(new TreeView());
            break;
        case PropertyType.Enum:
            parent.Add(new ComboBox());
            break;
        case PropertyType.Reference:
            parent.Add(new ComboBox());
            break;
    }
}

使用此代码创建并添加小部件,但它们在框架上都具有相同的分布(它们相距很远)并且我希望它们之间的距离是固定的(例如10px)我也希望它们的高度是尽管屏幕上显示了小部件的数量,但也已修复。

也许Vbox不是我应该使用的,但我不知道如何以其他方式做到这一点。所以我要求一些帮助:)

PS:另一件事(我不知道会有多少个小部件......所以如果有太多我希望有一个滚动条来滚动面板,那么对此的一些帮助也将受到赞赏。)非常感谢你。

1 个答案:

答案 0 :(得分:1)

我刚刚发现我的代码中出现了什么问题,我想出了解决方案。我刚刚使用PackStart而不是简单的Add方法。

        Widget widget = null;
        switch (objectProperty.Type)
        {
            case PropertyType.Text:
                widget = new TextField(objectProperty.Name);
                break;
            case PropertyType.Number:
                widget = new SpinnerField(objectProperty.Name);
                break;
            case PropertyType.Note:
                widget = new NoteField(objectProperty.Name) { HeightRequest = 80 };
                break;
            case PropertyType.List:
                widget = new ListField(objectProperty.Name) { HeightRequest = 100 }; ;
                break;
            case PropertyType.Enum:
                widget = new ComboField(objectProperty.Name);
                break;
            case PropertyType.Reference:
                widget = new ComboField(objectProperty.Name);
                break;
        }
        parent.PackStart(widget, false, true, 8);

这种方式有效!!只是为了让大家都知道;)