系统托盘菜单
添加系统托盘菜单
自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()
}