跳过正文
  1. 文章/
  2. GoLang/
  3. GUI/
  4. Wails/

2、Runtime

·5624 字·12 分钟· loading · loading · ·
GoLang GUI Wails
GradyYoung
作者
GradyYoung
目录
Wails - 点击查看当前系列文章
§ 2、Runtime 「 当前文章 」

运行时
#

运行时是一个为应用程序提供实用方法的库。 有 Go 和 JavaScript 运行时,目的是在可能的情况下尝试使它们保持一致。

Go 运行时可通过导入 github.com/wailsapp/wails/v2/pkg/runtime 获取。 此包中的所有方法都将 context 作为第一个参数。此 context 应该从应用启动回调前端 Dom 加载完成回调方法中获取。

JavaScript 库可通过 window.runtime 提供给前端。 使用 开发 模式时会生成一个运行时包,该包为运行时提供 TypeScript 声明。 这应该位于您的前端目录的wailsjs目录中。

隐藏
#

隐藏应用程序。

  • Go: Hide(ctx context.Context)
  • JS: Hide()

Hide 在 Mac 上,这将以与标准 Mac 应用程序中的菜单项相同的方式隐藏应用程序。 这与隐藏窗口不同,但应用程序仍处于前台。 对于 Windows 和 Linux,这与 WindowHide 相同。

显示
#

显示应用程序。

  • Go: Show(ctx context.Context)
  • JS: Show()

在 Mac 上,这会将应用程序带回前台。 对于 Windows 和 Linux,这目前与 WindowShow 相同。

退出
#

退出应用程序。

  • Go: Quit(ctx context.Context)
  • JS: Quit()

环境
#

返回当前环境的详细信息。

  • Go: Environment(ctx context.Context) EnvironmentInfo
  • JS: Environment(): Promise<EnvironmentInfo>

Go - EnvironmentInfo
#

type EnvironmentInfo struct {
    BuildType string
    Platform  string
    Arch      string
}

JS - EnvironmentInfo
#

interface EnvironmentInfo {
  buildType: string;
  platform: string;
  arch: string;
}

浏览器打开 URL
#

使用系统默认浏览器打开给定的 URL。

  • Go: BrowserOpenURL(ctx context.Context, url string)
  • JS: BrowserOpenURL(url string)

Events 事件
#

Wails 运行时提供了一个统一的事件系统,其中事件可以由 Go 或 JavaScript 发出或接收。

可选地,数据可以与事件一起传递。 侦听器将接收本地数据类型中的数据。

EventsOn 添加事件侦听器
#

此方法为给定的事件名称设置一个侦听器。

当触发指定事件名为 eventName 类型的事件时,将触发回调。 与触发事件一起发送的任何其他数据都将传递给回调。 它返回一个函数来取消侦听器。

  • Go: EventsOn(ctx context.Context, eventName string, callback func(optionalData ...interface{})) func()
  • JS: EventsOn(eventName string, callback function(optionalData?: any)): () => void

EventsOff 移除事件侦听器
#

此方法取消注册给定事件名称的侦听器,可选地,可以通过 additionalEventNames 取消注册多个侦听器。

  • Go: EventsOff(ctx context.Context, eventName string, additionalEventNames ...string)
  • JS: EventsOff(eventName string, ...additionalEventNames)

EventsOnce 添加只触发一次的事件侦听器
#

此方法为给定的事件名称设置一个侦听器,但只会触发一次。 它返回 一个函数来取消侦听器。

  • Go: EventsOnce(ctx context.Context, eventName string, callback func(optionalData ...interface{})) func()
  • JS: EventsOnce(eventName string, callback function(optionalData?: any)): () => void

EventsOnMultiple 添加指定触发次数的事件侦听器
#

此方法为给定的事件名称设置一个侦听器,但最多只能触发 counter 次。 它返回 一个函数来取消侦听器。

  • Go: EventsOnMultiple(ctx context.Context, eventName string, callback func(optionalData ...interface{}), counter int) func()
  • JS: EventsOnMultiple(eventName string, callback function(optionalData?: any), counter int): () => void

EventsEmit 触发指定事件
#

此方法触发指定的事件。 可选数据可以与事件一起传递。 这将触发任意事件侦听器。

  • Go: EventsEmit(ctx context.Context, eventName string, optionalData ...interface{})
  • JS: EventsEmit(eventName: string, ...optionalData: any)

Log 日志
#

Wails 运行时提供了一种可以从 Go 或 JavaScript 调用日志记录的机制。 像大多数记录器一样,有许多日志级别:

  • Trace(追踪)
  • Debug(调试)
  • Info(信息)
  • Warning(警告)
  • Error(错误)
  • Fatal(致命)

记录器将输出当前或更高日志级别的任何日志消息。

示例:Debug日志级别将输出除Trace消息之外的所有消息。

原始消息 Print
#

LogPrint Print 日志
#

将给定的消息记录为原始消息。

  • Go: LogPrint(ctx context.Context, message string)
  • JS: LogPrint(message: string)

LogPrintf 格式化 Print 日志
#

将给定的消息记录为原始消息。

Go: LogPrintf(ctx context.Context, format string, args ...interface{})

Trace
#

LogTrace Trace 日志
#

Trace 日志级别记录给定的消息。

  • Go: LogTrace(ctx context.Context, message string)
  • JS: LogTrace(message: string)

LogTracef 格式化 Trace 日志
#

Trace 日志级别记录给定的消息。

Go: LogTracef(ctx context.Context, format string, args ...interface{})

Debug
#

LogDebug Debug 日志
#

Debug 日志级别记录给定的消息。

  • Go: LogDebug(ctx context.Context, message string)
  • JS: LogDebug(message: string)

LogDebugf 格式化 Debug 日志
#

Debug 日志级别记录给定的消息。

Go: LogDebugf(ctx context.Context, format string, args ...interface{})

Info
#

LogInfo Info 日志
#

Info日志级别记录给定的消息。

  • Go: LogInfo(ctx context.Context, message string)
  • JS: LogInfo(message: string)

LogInfof 格式化 Info 日志
#

Info日志级别记录给定的消息。

Go: LogInfof(ctx context.Context, format string, args ...interface{})

Warning
#

LogWarning Warning 日志
#

Warning 日志级别记录给定的消息。

  • Go: LogWarning(ctx context.Context, message string)
  • JS: LogWarning(message: string)

LogWarningf 格式化 Warning 日志
#

Warning 日志级别记录给定的消息。

Go: LogWarningf(ctx context.Context, format string, args ...interface{})

Error
#

LogError Error 日志
#

Error 日志级别记录给定的消息。

  • Go: LogError(ctx context.Context, message string)
  • JS: LogError(message: string)

LogErrorf 格式化 Error 日志
#

Error 日志级别记录给定的消息。

Go: LogErrorf(ctx context.Context, format string, args ...interface{})

Fatal
#

LogFatal Fatal 日志
#

Fatal 日志级别记录给定的消息。

  • Go: LogFatal(ctx context.Context, message string)
  • JS: LogFatal(message: string)

LogFatalf 格式化 Fatal 日志
#

Fatal 日志级别记录给定的消息。

Go: LogFatalf(ctx context.Context, format string, args ...interface{})

设置日志级别
#

设置日志级别。 在 JavaScript 中,该数字与以下日志级别有关:

日志等级
1 Trace(追踪)
2 Debug(调试)
3 Info(信息)
4 Warning(警告)
5 Error(错误)
  • Go: LogSetLogLevel(ctx context.Context, level logger.LogLevel)
  • JS: LogSetLogLevel(level: number)

使用自定义日志
#

可以通过使用应用程序参数选项日志提供自定义记录器来使用它。

唯一的要求是记录器实现在 github.com/wailsapp/wails/v2/pkg/loggerlogger.Logger 定义的接口:

type Logger interface {
    Print(message string)
    Trace(message string)
    Debug(message string)
    Info(message string)
    Warning(message string)
    Error(message string)
    Fatal(message string)
}

Window 窗口
#

相关对象定义
#

Position(位置)
#

interface Position {
  x: number;
  y: number;
}

Size(尺寸)
#

interface Size {
  w: number;
  h: number;
}

WindowSetTitle 窗口标题
#

设置窗口标题栏中的文本。

  • Go: WindowSetTitle(ctx context.Context, title string)
  • JS: WindowSetTitle(title: string)

WindowFullscreen 窗口全屏
#

使窗口全屏。

  • Go: WindowFullscreen(ctx context.Context)
  • JS: WindowFullscreen()

WindowUnfullscreen 窗口取消全屏
#

恢复全屏之前的先前窗口尺寸和位置。

  • Go: WindowUnfullscreen(ctx context.Context)
  • JS: WindowUnfullscreen()

WindowIsFullscreen 窗口是否全屏
#

如果窗口是全屏的,则返回 true。

  • Go: WindowIsFullscreen(ctx context.Context) bool
  • JS: WindowIsFullscreen() Promise<boolean>

WindowCenter 窗口居中
#

使窗口在当前窗口所在的监视器上居中。

  • Go: WindowCenter(ctx context.Context)
  • JS: WindowCenter()

WindowExecJS 窗口执行JS代码
#

在窗口中执行任意 JS 代码。

此方法在浏览器中异步运行代码并立即返回。 如果脚本导致任何错误,它们将只在浏览器控制台中可用。

Go: WindowExecJS(ctx context.Context, js string)

WindowReload 窗口重新加载
#

执行“重新加载”(重新加载当前页面)。

  • Go: WindowReload(ctx context.Context)
  • JS: WindowReload()

WindowReloadApp 重新加载应用程序前端。
#

重新加载应用程序前端。

  • Go: WindowReloadApp(ctx context.Context)
  • JS: WindowReloadApp()

WindowSetSystemDefaultTheme 窗口设置系统默认主题
#

仅限 Windows。

  • Go: WindowSetSystemDefaultTheme(ctx context.Context)
  • JS: WindowSetSystemDefaultTheme()

将窗口主题设置为系统默认值(暗/亮)。

WindowSetLightTheme 窗口设置浅色主题
#

仅限 Windows。

  • Go: WindowSetLightTheme(ctx context.Context)
  • JS: WindowSetLightTheme()

将窗口主题设置为浅色。

WindowSetDarkTheme 窗口设置深色主题
#

仅限 Windows。

  • Go: WindowSetDarkTheme(ctx context.Context)
  • JS: WindowSetDarkTheme()

将窗口主题设置为深色。

WindowShow 显示窗口
#

显示窗口,如果它当前是隐藏的。

  • Go: WindowShow(ctx context.Context)
  • JS: WindowShow()

WindowShow 隐藏窗口
#

如果当前可见,则隐藏窗口。

  • Go: WindowHide(ctx context.Context)
  • JS: WindowHide()

WindowIsNormal 窗口是否为正常
#

如果窗口未最小化、最大化或全屏,则返回 true。

  • Go: WindowIsNormal(ctx context.Context) bool
  • JS: WindowIsNormal() Promise<boolean>

WindowSetSize 设置窗口尺寸
#

设置窗口的宽度和高度。

  • Go: WindowSetSize(ctx context.Context, width int, height int)
  • JS: WindowSetSize(width: number, height: number)

WindowSetSize 获取窗口尺寸
#

获取窗口的宽度和高度。

  • Go: WindowGetSize(ctx context.Context) (width int, height int)
  • JS: WindowGetSize(): Promise<Size>

WindowSetMinSize 设置窗口最小尺寸
#

设置窗口最小尺寸。 如果窗口当前小于给定尺寸,将调整窗口大小。

设置大小 0,0 将禁用此约束。

  • Go: WindowSetMinSize(ctx context.Context, width int, height int)
  • JS: WindowSetMinSize(width: number, height: number)

WindowSetMaxSize 设置窗口最大尺寸
#

设置窗口最大尺寸。 如果窗口当前大于给定尺寸,将调整窗口大小。

设置大小 0,0 将禁用此约束。

  • Go: WindowSetMaxSize(ctx context.Context, width int, height int)
  • JS: WindowSetMaxSize(width: number, height: number)

WindowSetAlwaysOnTop 设置窗口置顶
#

设置窗口置顶或取消置顶。

  • Go: WindowSetAlwaysOnTop(ctx context.Context, b bool)
  • JS: WindowSetAlwaysOnTop(b: boolean)

WindowSetPosition 设置窗口位置
#

设置相对于窗口当前所在监视器的窗口位置。

  • Go: WindowSetPosition(ctx context.Context, x int, y int)
  • JS: WindowSetPosition(x: number, y: number)

WindowGetPosition 获取窗口位置
#

获取相对于窗口当前所在监视器的窗口位置。

  • Go: WindowGetPosition(ctx context.Context) (x int, y int)
  • JS: WindowGetPosition(): Promise<Position>

WindowMaximise 窗口最大化
#

最大化窗口以填满屏幕。

  • Go: WindowMaximise(ctx context.Context)
  • JS: WindowMaximise()

WindowUnmaximise 窗口取消最大化
#

将窗口恢复到最大化之前的尺寸和位置。

  • Go: WindowUnmaximise(ctx context.Context)
  • JS: WindowUnmaximise()

WindowIsMaximised 窗口是否最大化
#

如果窗口最大化,则返回 true。

  • Go: WindowIsMaximised(ctx context.Context) bool
  • JS: WindowIsMaximised() Promise<boolean>

WindowToggleMaximise 窗口最大化切换
#

在最大化和未最大化之间切换。

  • Go: WindowToggleMaximise(ctx context.Context)
  • JS: WindowToggleMaximise()

WindowMinimise 窗口最小化。
#

最小化窗口。

  • Go: WindowMinimise(ctx context.Context)
  • JS: WindowMinimise()

WindowUnminimise 窗口取消最小化
#

将窗口恢复到最小化之前的尺寸和位置。

  • Go: WindowUnminimise(ctx context.Context)
  • JS: WindowUnminimise()

WindowIsMinimised 窗口是否最小化
#

如果窗口最小化,则返回 true。

  • Go: WindowIsMinimised(ctx context.Context) bool
  • JS: WindowIsMinimised() Promise<boolean>

WindowSetBackgroundColour 窗口设置背景色
#

将窗口的背景颜色设置为给定的 RGBA 颜色定义。 这种颜色将显示所有透明像素。

R、G、B 和 A 的有效值为 0-255

**注意:**在 Windows 上,仅支持 0 或 255 的 alpha 值。 任何非 0 的值都将被视为 255。

  • Go: WindowSetBackgroundColour(ctx context.Context, R, G, B, A uint8)
  • JS: WindowSetBackgroundColour(R, G, B, A)

WindowPrint
#

打开本地打印对话框。

  • Go: WindowPrint(ctx context.Context)
  • JS: WindowPrint()

Dialog 对话框
#

运行时的这一部分提供对原生对话框的调用,例如文件选择器和消息框。

**注意:**JS 运行时当前不支持对话框。

相关结构体
#

OpenDialogOptions
#

type OpenDialogOptions struct {
    DefaultDirectory           string
    DefaultFilename            string
    Title                      string
    Filters                    []FileFilter
    ShowHiddenFiles            bool
    CanCreateDirectories       bool
    ResolvesAliases            bool
    TreatPackagesAsDirectories bool
}
字段 描述 Win Mac Linux
DefaultDirectory 对话框打开时显示的目录
DefaultFilename 默认文件名
Title 对话框的标题
Filters 文件过滤器列表
ShowHiddenFiles 显示系统隐藏的文件
CanCreateDirectories 允许用户创建目录
ResolvesAliases 如果为 true,则返回文件而不是别名
TreatPackagesAsDirectories 允许导航到包

MessageDialogOptions
#

type MessageDialogOptions struct {
    Type          DialogType
    Title         string
    Message       string
    Buttons       []string
    DefaultButton string
    CancelButton  string
}
字段 描述 Win Mac Lin
Type 消息对话框的类型,例如问题、信息…
Title 对话框的标题
Message 向用户显示的消息
Buttons 按钮标题列表
DefaultButton 带有此文本的按钮应被视为默认按钮。 必定 return
CancelButton 带有此文本的按钮应被视为取消。 必定 escape
不同系统按钮的区别
#

Windows 具有标准对话框类型,其中的按钮不可自定义。 返回的值将是以下之一:“Ok”、“Cancel”、“Abort”、“Retry”、“Ignore”、“Yes”、“No”、“Try Again"或"Continue”。

对于问题对话框,默认按钮是 “是”,取消按钮是 “否”。 可以通过将 默认按钮 值设置为 "否" 来改变这一点。

result, err := runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{
    Type:          runtime.QuestionDialog,
    Title:         "Question",
    Message:       "Do you want to continue?",
    DefaultButton: "No",
})

Linux 有标准的对话框类型,其中的按钮是不可定制的。 返回的值将是以下之一:“Ok”、“Cancel”、“Yes”、“No”。

Mac 上的消息对话框最多可以指定 4 个按钮。 如果没有 DefaultButtonCancelButton 给出,第一个按钮被认为是默认的并绑定到 return 键。

selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{
    Title:        "It's your turn!",
    Message:      "Select a number",
    Buttons:      []string{"one", "two", "three", "four"},
})

img

如果我们指定 DefaultButton 为“two”,则第二个按钮显示为默认值。 当 return 被按下时,则返回数值“two”。

selection, err := runtime.MessageDialog(b.ctx, runtime.MessageDialogOptions{
    Title:         "It's your turn!",
    Message:       "Select a number",	
    Buttons:       []string{"one", "two", "three", "four"},
    DefaultButton: "two",
})

img

对话框类型 Type
#
const (
    InfoDialog     DialogType = "info"
    WarningDialog  DialogType = "warning"
    ErrorDialog    DialogType = "error"
    QuestionDialog DialogType = "question"
)

FileFilter 文件过滤
#

type FileFilter struct {
    DisplayName string // Filter information EG: "Image Files (*.jpg, *.png)"
    Pattern     string // semi-colon separated list of extensions, EG: "*.jpg;*.png"
}
Windows
#

Windows 允许您在对话框中使用多个文件过滤器。 每个 FileFilter 将在对话框中显示为一个单独的条目:

img

Linux
#

Linux 允许您在对话框中使用多个文件过滤器。 每个 FileFilter 将在对话框中显示为一个单独的条目:

img

Mac
#

Mac 对话框只有一组模式来过滤文件的概念。 如果提供了多个 FileFilters,Wails 将使用所有定义的模式。

selection, err := runtime.OpenFileDialog(b.ctx, runtime.OpenDialogOptions{
    Title: "Select File",
    Filters: []runtime.FileFilter{
        {
            DisplayName: "Images (*.png;*.jpg)",
            Pattern:     "*.png;*.jpg",
        }, {
            DisplayName: "Videos (*.mov;*.mp4)",
            Pattern:     "*.mov;*.mp4",
        },
    },
})

这将导致使用 *.png,*.jpg,*.mov,*.mp4 作为过滤器打开文件对话框。

OpenDirectoryDialog 打开选择目录对话框
#

打开一个对话框,提示用户选择目录。

Go: OpenDirectoryDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)

返回值: 所选目录(如果用户取消则为空白)或错误

OpenFileDialog 打开选择文件对话框
#

打开一个对话框,提示用户选择文件。

Go: OpenFileDialog(ctx context.Context, dialogOptions OpenDialogOptions) (string, error)

返回值: 所选文件(如果用户取消则为空白)或错误

OpenMultipleFilesDialog 打开选择多文件对话框
#

打开一个对话框,提示用户选择多个文件。

Go: OpenMultipleFilesDialog(ctx context.Context, dialogOptions OpenDialogOptions) ([]string, error)

返回值: 选定的文件(如果用户取消则为 nil)或错误

SaveFileDialog 保存文件对话框
#

打开一个对话框,提示用户选择文件名以进行保存。

Go: SaveFileDialog(ctx context.Context, dialogOptions SaveDialogOptions) (string, error)

返回值: 所选文件(如果用户取消则为空白)或错误

MessageDialog 消息对话框
#

使用消息对话框显示消息。

Go: MessageDialog(ctx context.Context, dialogOptions MessageDialogOptions) (string, error)

返回值: 所选按钮的文本或错误

Menu 菜单 #

这些方法与应用程序菜单相关。

**注意:**JS 运行时当前不支持菜单。

相关结构体
#

菜单结构体
#

type Menu struct {
    Items []*MenuItem
}

提供了一个简单的辅助方法来构建菜单:

func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu

菜单项结构体
#

// 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
}
字段 类型 注解
Label string 菜单文字
Accelerator *keys.Accelerator 此菜单项的键绑定
Type Type 菜单项的类型
Disabled bool 禁用菜单项
Hidden bool 隐藏此菜单项
Checked bool 添加检查项目 (复选框和单选类型)
SubMenu *Menu 设置子菜单
Click Callback 单击菜单时的回调函数
Role string 定义此菜单项的角色。 暂时只支持 Mac

快捷键
#

键盘快捷键定义了按键和菜单项之间的绑定。 Wails 将加速器定义为一个组合或键 + 修饰符。 它们在 "github.com/wailsapp/wails/v2/pkg/menu/keys" 包中提供。

// Defines cmd+o on Mac and ctrl-o on Window/Linux
myShortcut := keys.CmdOrCtrl("o")

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)

菜单类型Type
#

每个菜单项必须有一个类型,有 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

您还可以使用addXXX方法直接在菜单上创建指定类型的菜单项:

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

回调Callback
#

type Callback func(*CallbackData)

type CallbackData struct {
    MenuItem    *MenuItem
}

该函数被赋予一个 CallbackData 结构,该结构指示哪个菜单项触发了回调。 这在使用可能共享回调的单选组时很有用。

角色Role
#

**注意:**目前仅 Mac 支持角色。

一个菜单项可能有一个角色,它本质上是一个预定义的菜单项。 我们目前支持以下角色:

角色 描述
AppMenuRole 标准的 Mac 应用程序菜单。 可以使用 menu.AppMenu() 创建
EditMenuRole 标准的 Mac 编辑菜单。 可以使用 menu.EditMenu() 创建

MenuSetApplicationMenu 设置应用程序菜单 #

将应用程序菜单设置为给定的菜单。

Go: MenuSetApplicationMenu(ctx context.Context, menu *menu.Menu)

MenuUpdateApplicationMenu 更新应用程序菜单 #

获取传递给 MenuSetApplicationMenu 的菜单的任意更改更新应用程序菜单。

Go: MenuUpdateApplicationMenu(ctx context.Context)

创建菜单示例
#

app := NewApp()

// 创建菜单
AppMenu := menu.NewMenu()
// 创建子菜单
FileMenu := AppMenu.AddSubmenu("File")
// 创建类型为 Text 的菜单项
FileMenu.AddText("&Open", keys.CmdOrCtrl("o"), openFile)
// 创建分隔线
FileMenu.AddSeparator()
// 创建类型为 Text 的菜单项
FileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) {
    runtime.Quit(app.ctx)
})

// 判断如果是 Mac,则创建默认的角色菜单
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,
    },
)

Clipboard 剪贴板
#

运行时的这一部分提供了对操作系统剪贴板的访问。

当前实现仅处理文本。

ClipboardGetText 剪贴板获取文本
#

从剪切板读取当前存储的文本。

  • Go: ClipboardGetText(ctx context.Context) (string, error)
    • 返回: 一个字符串(如果剪贴板为空,将返回一个空字符串)或一个错误。
  • JS: ClipboardGetText(): Promise<string>
    • 返回: 带有字符串结果的 Promise(如果剪贴板为空,将返回空字符串)。

ClipboardSetText 剪贴板设置文本
#

将文本写入剪切板。

  • Go: ClipboardSetText(ctx context.Context, text string) error

    • 返回: 如果存在错误,则会出现错误。
  • JS: ClipboardSetText(text: string): Promise<boolean>

    • 返回值: 一个Promise,如果文本成功地设置在剪贴板上,结果为 true,否则为 false。

Screen 屏幕
#

这些方法提供有关当前连接屏幕的信息。

相关对象
#

Go - Screen
#

type Screen struct {
    IsCurrent bool
    IsPrimary bool
    Width     int
    Height    int
}

Ts - Screen
#

interface Screen {
    isCurrent: boolean;
    isPrimary: boolean;
    width : number
    height : number
}

ScreenGetAll
#

返回当前连接屏幕的列表。

  • Go: ScreenGetAll(ctx context.Context) []screen
  • JS: ScreenGetAll()

Drag And Drop拖放
#

运行时的这一部分处理将文件或文件夹拖放到窗口中的操作。

要启用此功能,必须在 options.App 中将 EnableFileDrop 设置为 true

OnFileDrop 注册拖放监听
#

这个方法是注册文件或文件夹拖放到窗口时回调函数

Go: OnFileDrop(ctx context.Context, callback func(x, y int, paths []string))

JS: OnFileDrop(callback: (x: number, y: number, paths: string[]) => void, useDropTarget: boolean) :void

调用回调函数,其中包含释放拖动时窗口内的坐标和绝对文件路径。

OnFileDropOff 取消拖放监听
#

此方法会移除所有已注册的拖放事件侦听器和处理程序。

  • Go: OnFileDropOff(ctx context.Context)
  • JS: OnFileDropOff(): void
Wails - 点击查看当前系列文章
§ 2、Runtime 「 当前文章 」