Golang Fyne框架中Resize()/Move()方法调用不生效问题
Fyne中Resize()/Move()不生效的核心原因
Fyne采用布局容器驱动的UI渲染规则:所有带自动布局逻辑的容器(包括container.NewMax、container.NewBorder、container.NewVBox/HBox、container.NewCenter、container.NewGrid等),会在每次界面刷新时,根据自身布局规则重新计算所有子组件的尺寸和位置,你手动对子组件调用Resize()/Move()设置的参数会被直接覆盖,自然达不到预期效果。
你给出的示例代码里,把矩形组件放在了container.NewMax()容器中,这个容器的默认逻辑就是把所有子组件拉伸到和自身可用空间完全一致的尺寸,根本不会读取你之前给矩形设置的500*500参数,最终矩形渲染尺寸完全由外层Border布局给header区域分配的空间决定,和你手动设置的值无关。
对应解决方案
根据你的实际需求选对应实现即可:
- 如果你需要组件保持固定尺寸/固定位置,不被自动布局拉伸、移位
把包裹该组件的父容器换成无布局容器,也就是通过container.NewWithoutLayout()创建的容器,这类容器不会主动修改子组件的尺寸和位置参数,你手动调用Resize()/Move()设置的值才会正常生效。
修正后的代码片段如下:func createUI(application fyne.App) *fyne.Container { exitBtn := widget.NewButton("Exit", func() { application.Quit() }) rect := canvas.NewRectangle(color.NRGBA{255, 0, 0, 255}) rect.Resize(fyne.NewSize(500, 500)) // 替换原Max容器为无布局容器,不会覆盖rect的尺寸设置 header := container.NewWithoutLayout(rect) nav := container.NewBorder(canvas.NewText("Navigate", color.Black), exitBtn, nil, nil) body := container.NewCenter(canvas.NewText("Content", color.Black)) return container.NewBorder(header, nil, nav, body) } - 如果你需要组件适配自动布局,但要保证组件的最小占用尺寸
不要手动调用Resize(),而是通过组件的MinSize()方法返回你需要的最小尺寸值,自动布局在计算空间分配时会参考这个值分配对应空间,不会把组件压缩到你设定的尺寸以下。 - 注意:不要在窗口还未执行
ShowAndRun()、组件还未完成挂载时调用Resize()/Move(),此时整个布局树还没完成初始化,设置的参数不会被纳入渲染计算。如果需要在界面渲染完成后调整组件尺寸/位置,把调用逻辑放在窗口显示之后执行即可。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

