包container提供用于布局和组织应用程序的容器。

import "fyne.io/fyne/v2/container"

普通容器

获取Container实例

使用New函数获取一个新的Container实例,其中包含指定的CanvasObjects,这些对象将根据指定的Layout进行布局。

func New(layout fyne.Layout, objects ...fyne.CanvasObject) *fyne.Container

还可以使用封装后的函数返回指定布局的容器。

函数名作用
NewGridWithColumns网格布局,指定列数
NewGridWithRows网格布局,指定行数
NewGridWrap网格布局,指定元素大小
NewHBox水平布局,元素从左往右排列
NewMax元素会尽可能的填满整个空间
NewPadded元素按照标准大小填入
NewVBox垂直布局,元素从上往下排列
NewWithoutLayout没有布局

AppTabs 选项卡

定义

type AppTabs struct {
	widget.BaseWidget
	//  选项
	Items []*TabItem
	//  已启用,使用下面那个函数替代
	OnChanged    func(*TabItem)
	//  选项被选时的函数
	OnSelected   func(*TabItem)
	//  选项未选时的函数
	OnUnselected func(*TabItem)
}

示例

package main
 
import (
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
)
 
func main() {
	App := app.New()
	Window := App.NewWindow("test")
 
	l1 := widget.NewLabel("Hello")
	l2 := widget.NewLabel("World!")
 
	tabs := container.NewAppTabs(
		container.NewTabItem("Tab 1", l1),
		container.NewTabItem("Tab 2", l2),
	)
	//  改变选项卡位置(右边)
	tabs.SetTabLocation(container.TabLocationTrailing)
 
	Window.SetContent(tabs)
	Window.ShowAndRun()
}

DocTabs 选项卡

与AppTabs类似,但实现了更多的操作,类似与浏览器的标签

定义

type DocTabs struct {
	widget.BaseWidget
	//  选项
	Items []*TabItem
	//  选项函数
	CreateTab      func() *TabItem
	CloseIntercept func(*TabItem)
	OnClosed       func(*TabItem)
	OnSelected     func(*TabItem)
	OnUnselected   func(*TabItem)
}

示例

package main
 
import (
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
)
 
func main() {
	App := app.New()
	Window := App.NewWindow("test")
 
	l1 := widget.NewLabel("Hello")
	l2 := widget.NewLabel("World!")
 
	tabs := container.NewDocTabs(
		container.NewTabItem("Tab 1", l1),
		container.NewTabItem("Tab 2", l2),
	)
 
	Window.SetContent(tabs)
	Window.ShowAndRun()
}

Scroll 滚轮

定义

type Scroll = widget.Scroll

示例

package main
 
import (
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/canvas"
	"fyne.io/fyne/v2/container"
	"image/color"
)
 
func main() {
	App := app.New()
	Window := App.NewWindow("test")
 
	box := container.NewVBox()
	for i := 0; i < 20; i++ {
		box.Add(canvas.NewText("hello", color.White))
	}
 
	scroll := container.NewScroll(box)
	Window.SetContent(scroll)
 
	Window.ShowAndRun()
}

Split 分割线

定义

type Split struct {
	widget.BaseWidget
	//  偏移量
	Offset     float64
	//  是否水平分割
	Horizontal bool
	//  左右两边的元素
	Leading    fyne.CanvasObject
	Trailing   fyne.CanvasObject
}

示例

package main
 
import (
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
)
 
func main() {
	App := app.New()
	Window := App.NewWindow("test")
 
	l := container.NewVBox()
	l.Add(widget.NewButton("left", func() {}))
 
	r := container.NewVBox()
	r.Add(widget.NewButton("right", func() {}))
 
	s := container.NewHSplit(l, r)
 
	Window.SetContent(s)
	Window.ShowAndRun()
}