Win11下Fyne v2.4的ShowPopUp/ShowModalPopUp未实现模态效果问题
Fyne v2.4 实现Win11下的模态弹窗(类似C# Forms效果)
你的问题出在对Fyne弹窗API的理解偏差上——ShowPopUp和ShowModalPopUp是用来在已有窗口的画布上弹出浮动层,而非创建新窗口后再弹窗。你每次点击按钮都新建a.NewWindow(),相当于把弹窗做成了独立窗口的内容,自然无法锁定主窗口,也不会有灰显效果。
正确实现步骤
- 不要新建窗口,直接基于主窗口的画布创建弹窗内容
- 添加半透明灰色背景实现主窗口灰显效果
- 使用
ShowModalPopUp弹出,它会自动锁定底层画布交互
修正后的代码
package main import ( "image/color" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" ) func main() { a := app.New() w := a.NewWindow("Pop up demo") w.Resize(fyne.NewSize(600, 600)) mainCanvas := w.Canvas() // 获取主窗口画布 hello := widget.NewLabel("Demo Fyne show popup vs show modal popup") w.SetContent(container.NewVBox( hello, widget.NewButton("pop demo!", func() { hello.SetText("Show me a popup") // 弹窗内容:红色矩形+关闭按钮 red := color.NRGBA{R: 180, G: 0, B: 0, A: 255} rectPop := canvas.NewRectangle(&red) rectPop.SetMinSize(fyne.NewSize(200, 200)) closeBtn := widget.NewButton("关闭", func() { widget.HidePopUp(rectPop) }) popupContent := container.NewBorder(nil, closeBtn, nil, nil, rectPop) // 在主窗口画布上弹出普通弹窗(不锁定主窗口) widget.ShowPopUp(popupContent, mainCanvas) }), widget.NewButton("Modal demo", func() { hello.SetText("show me a ModalPopup") // 1. 创建半透明背景(实现主窗口灰显) bg := canvas.NewRectangle(color.NRGBA{R: 0, G: 0, B: 0, A: 120}) bg.Resize(mainCanvas.Size()) // 背景铺满主窗口 // 2. 创建弹窗核心内容:蓝色矩形+关闭按钮 blue := color.NRGBA{R: 0, G: 0, B: 180, A: 255} rect := canvas.NewRectangle(&blue) rect.SetMinSize(fyne.NewSize(200, 200)) closeBtn := widget.NewButton("关闭", func() { widget.HidePopUp(bg) // 关闭弹窗时隐藏背景和内容 }) popupContent := container.NewBorder(nil, closeBtn, nil, nil, rect) // 3. 将背景和弹窗内容合并,居中显示 modalContainer := container.NewStack(bg, container.NewCenter(popupContent)) // 在主窗口画布上弹出模态弹窗(锁定主窗口交互) widget.ShowModalPopUp(modalContainer, mainCanvas) }), )) w.ShowAndRun() }
关键说明
ShowModalPopUp会阻止用户与主窗口交互,直到弹窗被widget.HidePopUp()关闭- 半透明背景需要手动创建并铺满主窗口画布,实现灰显效果
- 普通
ShowPopUp不会锁定主窗口,用户依然可以操作底层内容
内容的提问来源于stack exchange,提问作者DaHerb
相关产品推荐
相关产品推荐

