| name | wails-menus-dialogs |
| description | 应用菜单(菜单栏)、上下文菜单(右键)、系统托盘(systray)、对话框(消息/文件/自定义)。当用户问到「app.NewMenu / app.Menu.Set / Submenu / AddRole / FileMenu EditMenu / OnClick / SystemTray / app.SystemTray.New / app.Dialog / OpenFile / SaveFile / Question / Info / Custom Dialog」时使用。 |
Wails v3 - 菜单与对话框
桌面应用的标准 UI 组件:菜单栏、右键菜单、系统托盘、消息/文件对话框。
何时使用本 SKILL
- 创建跨平台菜单栏(File / Edit / View / Help)
- 实现右键上下文菜单
- 实现系统托盘图标 + 弹出菜单
- 弹出消息对话框(Info / Warning / Error / Question)
- 文件选择 / 保存 / 文件夹选择对话框
- 自定义对话框(用一个 webview 窗口实现)
关键摘要
应用菜单(菜单栏)
import (
"runtime"
"github.com/wailsapp/wails/v3/pkg/application"
)
menu := app.NewMenu()
if runtime.GOOS == "darwin" {
menu.AddRole(application.AppMenu)
}
menu.AddRole(application.FileMenu)
menu.AddRole(application.EditMenu)
menu.AddRole(application.WindowMenu)
menu.AddRole(application.HelpMenu)
app.Menu.Set(menu)
app.Window.NewWithOptions(application.WebviewWindowOptions{
UseApplicationMenu: true,
})
⚠️ macOS 菜单栏全局;Windows/Linux 在窗口标题栏,需 UseApplicationMenu: true。
自定义菜单项
fileMenu := menu.AddSubmenu("File")
fileMenu.Add("New").OnClick(func(ctx *application.Context) { })
fileMenu.Add("Open").OnClick(func(ctx *application.Context) { })
fileMenu.AddSeparator()
fileMenu.Add("Quit").OnClick(func(ctx *application.Context) { app.Quit() })
菜单项属性
item := fileMenu.Add("Open")
item.SetAccelerator("CmdOrCtrl+O")
item.SetEnabled(false)
item.SetChecked(true)
item.SetHidden(false)
item.SetLabel("Open File...")
item.SetTooltip("Open a file from disk")
item.SetIcon(iconBytes)
内置 Roles
| Role | 说明 |
|---|
AppMenu | macOS 应用菜单(About / Preferences / Hide / Quit) |
FileMenu | 标准 File 菜单(New / Open / Save / Close) |
EditMenu | 编辑(Undo / Redo / Cut / Copy / Paste / Select All) |
ViewMenu | 视图(Reload / DevTools / Zoom) |
WindowMenu | 窗口(Minimize / Maximize / Close) |
HelpMenu | 帮助 |
ServicesMenu | macOS Services 子菜单 |
上下文菜单(右键)
ctxMenu := app.ContextMenu.New()
ctxMenu.Add("Copy").OnClick(func(ctx *application.Context) { })
ctxMenu.Add("Paste").OnClick(func(ctx *application.Context) { })
ctxMenu.AddSeparator()
ctxMenu.Add("Properties").OnClick(...)
前端触发:
<div data-contextmenu="my-menu">右键打开菜单</div>
或 JS:
import { Application } from '@wailsio/runtime'
Application.OpenContextMenu('my-menu', {x: e.x, y: e.y, data: 'value'})
系统托盘(SystemTray)
tray := app.SystemTray.New()
tray.SetIcon(iconBytes)
tray.SetTooltip("My App")
tray.SetLabel("Status: OK")
trayMenu := app.NewMenu()
trayMenu.Add("Show").OnClick(func(ctx *application.Context) { ... })
trayMenu.Add("Quit").OnClick(func(ctx *application.Context) { app.Quit() })
tray.SetMenu(trayMenu)
tray.OnClick(func() { ... })
tray.OnRightClick(func() { ... })
tray.OnDoubleClick(func() { ... })
消息对话框
app.Dialog.Info().SetTitle("成功").SetMessage("操作完成").Show()
app.Dialog.Warning().SetTitle("警告").SetMessage("不可撤销").Show()
app.Dialog.Error().SetTitle("错误").SetMessage("出错了").Show()
d := app.Dialog.Question().SetTitle("确认").SetMessage("继续?")
yes := d.AddButton("是"); yes.OnClick(func() { })
no := d.AddButton("否")
d.SetDefaultButton(yes)
d.SetCancelButton(no)
d.Show()
文件对话框
path, err := app.Dialog.OpenFile().
SetTitle("选择图片").
AddFilter("Images", "*.png;*.jpg;*.gif").
SetDirectory("/initial/path").
PromptForSingleSelection()
paths, err := app.Dialog.OpenFile().
AddFilter("Documents", "*.pdf;*.docx").
PromptForMultipleSelection()
path, err := app.Dialog.SaveFile().
SetTitle("保存为").
SetFilename("untitled.txt").
AddFilter("Text", "*.txt").
PromptForSingleSelection()
folder, err := app.Dialog.OpenFile().
CanChooseDirectories(true).
CanChooseFiles(false).
PromptForSingleSelection()
自定义对话框
把任意 webview 窗口当对话框:
dialog := app.Window.NewWithOptions(application.WebviewWindowOptions{
Name: "settings-dialog",
Title: "Settings",
Width: 500, Height: 400,
URL: "http://wails.localhost/settings",
DisableResize: true,
AlwaysOnTop: true,
Hidden: false,
})
Context(菜单点击上下文)
fileMenu.Add("Open").OnClick(func(ctx *application.Context) {
win := ctx.ClickedWindow()
item := ctx.MenuItem()
})
References 索引
链接到其他 SKILL
- 应用入口(注册菜单) →
wails-application
- 窗口选项
UseApplicationMenu → wails-window
- 全局快捷键(KeyBinding) →
wails-runtime-features
- 菜单点击事件流 →
wails-events