You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:20:31