菜单
可以将应用程序菜单添加到 Wails 项目中。这可以通过定义一个 Menu 结构体并在 Menu
应用程序配置中设置它来实现,或者通过调用运行时方法 MenuSetApplicationMenu 来实现。
创建菜单的示例
app := NewApp()
AppMenu := menu.NewMenu()
FileMenu := AppMenu.AddSubmenu("File")
FileMenu.AddText("&Open", keys.CmdOrCtrl("o"), openFile)
FileMenu.AddSeparator()
FileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) {
runtime.Quit(app.ctx)
})
if runtime.GOOS == "darwin" {
AppMenu.Append(menu.EditMenu()) // on macos platform, we should append EditMenu to enable Cmd+C,Cmd+V,Cmd+Z... shortcut
}
err := wails.Run(&options.App{
Title: "Menus Demo",
Width: 800,
Height: 600,
Menu: AppMenu, // reference the menu above
Bind: []interface{}{
app,
},
)
// ...
也可以通过更新菜单结构体并调用 MenuUpdateApplicationMenu 来动态更新菜单。
上面的示例使用了辅助方法,但是也可以手动构建菜单结构体。
菜单
菜单是一个 MenuItem 集合
type Menu struct {
Items []*MenuItem
}
对于应用程序菜单,每个 MenuItem 代表一个单独的菜单,例如“编辑”。
提供了一个简单的辅助方法来构建菜单
func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu
这使得代码的布局更像菜单,而无需在创建菜单项后手动添加它们。或者,您也可以直接创建菜单项并将它们手动添加到菜单中。
MenuItem
MenuItem 代表菜单中的一个项目。
// MenuItem represents a menu item contained in a menu
type MenuItem struct {
Label string
Role Role
Accelerator *keys.Accelerator
Type Type
Disabled bool
Hidden bool
Checked bool
SubMenu *Menu
Click Callback
}
字段 | 类型 | 备注 |
---|---|---|
标签 | 字符串 | 菜单文本 |
加速键 | *keys.Accelerator | 此菜单项的键绑定 |
类型 | 类型 | MenuItem 类型 |
禁用 | 布尔值 | 禁用菜单项 |
隐藏 | 布尔值 | 隐藏此菜单项 |
选中 | 布尔值 | 在项目中添加选中标记(复选框和单选按钮类型) |
子菜单 | *菜单 | 设置子菜单 |
点击 | 回调 | 菜单点击时的回调函数 |
角色 | 字符串 | 为该菜单项定义一个 角色。目前仅限 macOS。 |
加速键
加速键(有时称为键盘快捷键)定义了按键与菜单项之间的绑定。Wails 将加速键定义为按键与 修饰键 的组合。它们可以在 "github.com/wailsapp/wails/v2/pkg/menu/keys"
包中找到。
示例
// Defines cmd+o on Mac and ctrl-o on Window/Linux
myShortcut := keys.CmdOrCtrl("o")
键是键盘上的任何单个字符,除了 +
,它被定义为 plus
。某些键无法用字符表示,因此有一些命名的字符可供使用
退格 | F1 | F16 | F31 |
Tab | F2 | F17 | F32 |
回车 | F3 | F18 | F33 |
Enter | F4 | F19 | F34 |
Esc | F5 | F20 | F35 |
左 | F6 | F21 | Num Lock |
右 | F7 | F22 | |
上 | F8 | F23 | |
下 | F9 | F24 | |
空格 | F10 | F25 | |
删除 | F11 | F36 | |
Home | F12 | F37 | |
End | F13 | F38 | |
Page Up | F14 | F39 | |
Page Down | F15 | F30 |
Wails 也支持使用与 Electron 相同的语法解析加速键。这对于在配置文件中存储加速键很有用。
示例
// Defines cmd+o on Mac and ctrl-o on Window/Linux
myShortcut, err := keys.Parse("Ctrl+Option+A")
修饰键
以下修饰键是可能与加速键组合使用的键
const (
// CmdOrCtrlKey represents Command on Mac and Control on other platforms
CmdOrCtrlKey Modifier = "cmdorctrl"
// OptionOrAltKey represents Option on Mac and Alt on other platforms
OptionOrAltKey Modifier = "optionoralt"
// ShiftKey represents the shift key on all systems
ShiftKey Modifier = "shift"
// ControlKey represents the control key on all systems
ControlKey Modifier = "ctrl"
)
提供了一些辅助方法来使用修饰键创建加速键
func CmdOrCtrl(key string) *Accelerator
func OptionOrAlt(key string) *Accelerator
func Shift(key string) *Accelerator
func Control(key string) *Accelerator
可以使用 keys.Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier)
组合修饰键
// Defines "Ctrl+Option+A" on Mac and "Ctrl+Alt+A" on Window/Linux
myShortcut := keys.Combo("a", ControlKey, OptionOrAltKey)
类型
每个菜单项都必须有一个类型,并且有 5 种类型可用
const (
TextType Type = "Text"
SeparatorType Type = "Separator"
SubmenuType Type = "Submenu"
CheckboxType Type = "Checkbox"
RadioType Type = "Radio"
)
为了方便起见,提供了一些辅助方法来快速创建菜单项
func Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem
func Separator() *MenuItem
func Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem
func Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem
func SubMenu(label string, menu *Menu) *Menu
您也可以通过使用“添加”辅助方法直接在菜单上创建菜单项
func (m *Menu) AddText(label string, accelerator *keys.Accelerator, click Callback) *MenuItem
func (m *Menu) AddSeparator() *MenuItem
func (m *Menu) AddRadio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem
func (m *Menu) AddCheckbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem
func (m *Menu) AddSubMenu(label string, menu *Menu) *MenuI
关于单选按钮组的说明:单选按钮组定义为菜单中彼此相邻的多个单选按钮菜单项。这意味着您无需将项目分组在一起,因为它是自动的。但是,这也意味着您无法在彼此相邻的位置设置 2 个单选按钮组 - 它们之间必须存在非单选按钮的项目。
回调
每个菜单项都可能有一个回调,在单击该项目时执行
type Callback func(*CallbackData)
type CallbackData struct {
MenuItem *MenuItem
}
该函数会获得一个 CallbackData
结构体,该结构体指示哪个菜单项触发了回调。这在使用可能共享回调的单选按钮组时很有用。
角色
角色目前仅在 macOS 上受支持。
菜单项可能有一个角色,本质上是一个预定义的菜单项。我们目前支持以下角色
角色 | 描述 |
---|---|
AppMenuRole | 标准 macOS 应用程序菜单。可以使用 menu.AppMenu() 创建 |
EditMenuRole | 标准 macOS 编辑菜单。可以使用 menu.EditMenu() 创建 |