现在我正在开发一个基于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:另一件事(我不知道会有多少个小部件......所以如果有太多我希望有一个滚动条来滚动面板,那么对此的一些帮助也将受到赞赏。)非常感谢你。答案 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);
这种方式有效!!只是为了让大家都知道;)