Skip to content
On this page

系统托盘菜单

添加系统托盘菜单

自v2.2.0发布以来,Fyne内置了对系统托盘菜单的支持。此功能在macOS、Windows和Linux计算机上显示一个图标,点击后将弹出应用程序指定的菜单。

由于这是一个特定于桌面的功能,我们必须首先进行运行时检查,确认应用程序正在桌面模式下运行。为了做到这一点,并获得对桌面功能的引用,我们执行Go类型断言:

go
	if desk, ok := a.(desktop.App); ok {
...
	}

如果ok变量为true,那么我们可以使用您以前在Window.SetMainMenu中使用过的标准Fyne菜单API来设置菜单。

go
m := fyne.NewMenu("MyApp",
			fyne.NewMenuItem("Show", func() {
				log.Println("Tapped show")
			}))
		desk.SetSystemTrayMenu(m)

通过将此代码添加到应用程序的设置中,您可以运行应用程序,并看到它在系统托盘中显示Fyne图标。当你点击它时,会出现一个包含“显示”和“退出”的菜单。

默认图标是Fyne徽标,您可以使用应用程序元数据或通过在app.SetIcon中设置应用程序图标或直接使用desk.SetSystemTrayIcon设置系统托盘的应用程序图标来解决此问题。

管理窗口生命周期

默认情况下,当您关闭所有窗口时,Fyne应用程序将退出,这可能不是您想要的系统托盘应用程序。要覆盖该行为,可以使用Window.SetCloseIntercept功能覆盖关闭窗口时发生的情况。在下面的示例中,我们通过调用window.hide()来隐藏窗口,而不是关闭它。在第一次显示窗口之前添加这个。

go
w.SetCloseIntercept(func() {
		w.Hide()
	})

隐藏窗口的好处是,您可以使用window.show()再次显示窗口,如果再次需要相同的内容,这比创建新窗口要高效得多。我们更新了之前创建的菜单,以显示上面隐藏的窗口。

go
fyne.NewMenuItem("Show", func() {
		w.Show()
	}))

完成应用程序

这就是用Fyne设置系统托盘菜单的全部内容!本教程的完整代码如下。

go
package main

import (
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/driver/desktop"
	"fyne.io/fyne/v2/widget"
)

func main() {
	a := app.New()
	w := a.NewWindow("SysTray")

	if desk, ok := a.(desktop.App); ok {
		m := fyne.NewMenu("MyApp",
			fyne.NewMenuItem("Show", func() {
				w.Show()
			}))
		desk.SetSystemTrayMenu(m)
	}

	w.SetContent(widget.NewLabel("Fyne System Tray"))
	w.SetCloseIntercept(func() {
		w.Hide()
	})
	w.ShowAndRun()
}