Fyne 系列 04:布局系统怎么选
cbowen

Fyne 里不要用固定像素去摆控件,而是用容器和布局组合界面。窗口大小变化时,布局会自动重新计算控件位置和尺寸。

VBox 和 HBox

VBox 纵向排列,HBox 横向排列,适合最简单的表单和按钮组。

1
2
3
4
5
content := container.NewVBox(
widget.NewLabel("用户名"),
widget.NewEntry(),
widget.NewButton("保存", func() {}),
)

横向按钮:

1
2
3
4
buttons := container.NewHBox(
widget.NewButton("取消", func() {}),
widget.NewButton("确定", func() {}),
)

Border

Border 适合常见应用结构:顶部工具栏、底部状态栏、左侧导航、右侧详情,中间是主要内容。

1
2
3
4
5
6
7
8
9
10
top := widget.NewToolbar(widget.NewToolbarAction(theme.DocumentCreateIcon(), func() {}))
bottom := widget.NewLabel("就绪")
left := widget.NewList(func() int { return 3 }, func() fyne.CanvasObject {
return widget.NewLabel("item")
}, func(id widget.ListItemID, obj fyne.CanvasObject) {
obj.(*widget.Label).SetText(fmt.Sprintf("项目 %d", id+1))
})
center := widget.NewLabel("内容区")

content := container.NewBorder(top, bottom, left, nil, center)

大多数桌面工具都可以先从 Border 开始搭骨架。

Grid 和 GridWrap

Grid 适合固定列数的布局,例如按钮矩阵。

1
2
3
4
5
content := container.NewGridWithColumns(3,
widget.NewButton("1", nil),
widget.NewButton("2", nil),
widget.NewButton("3", nil),
)

GridWrap 适合固定每个元素尺寸,然后自动换行,例如图标列表。

Split

Split 适合左右分栏或上下分栏。

1
2
split := container.NewHSplit(left, center)
split.Offset = 0.25

日志查看器、文件管理器、配置编辑器都常用这种结构。

选型建议

简单纵向表单用 VBox,典型应用框架用 Border,左右面板用 Split,规则网格用 Grid,复杂响应式页面再考虑自定义布局或 fyne-x 的 Responsive Layout。

 评论
评论插件加载失败
正在加载评论插件