Skip to content

事件系统 ​

每窗口一个 EventBus,两类事件:WindowEvent(窗口自身)与 PageEvent(WebView2 页面)。

WindowEvent ​

窗口级事件,带 payload 结构体。

cpp
win->on(WindowEvent::Resize, [](const ResizePayload& p) {
    // p.w, p.h
});
win->on(WindowEvent::Move, [](const MovePayload& p) {
    // p.x, p.y(去抖)
});
win->on(WindowEvent::Close, []([](){} /* 无 payload 或回调 */ {});

常见 WindowEvent:

事件payload触发
ResizeResizePayload{w,h}尺寸变(去抖)
MoveMovePayload{x,y}位置变(去抖)
Close—关闭前
Focus / Blur—获得/失焦
Minimize / Restore / Maximize—状态变
Show / Hide—显隐

去抖

Resize / Move 自带去抖——拖动过程不狂触发,停手后派发一次。避免拖拽时业务回调爆炸。

PageEvent ​

WebView2 页面级事件。

cpp
win->on(PageEvent::DidFinishLoad, []() {
    // 页面加载完成,可安全 executeJavaScript / call
});
win->on(PageEvent::TitleChanged, [](const TitlePayload& p) {
    // p.title
});

常见 PageEvent:

事件说明
DidFinishLoad页面加载完成(注入 runtime、调 JS 的安全时机)
TitleChanged页面标题变
NavigationStarting / NavigationCompleted导航起止

onBeforeClose ​

关闭是特殊事件——可取消:

cpp
win->onBeforeClose([]() -> bool {
    if (hasUnsavedWork()) {
        promptSave();
        return false;   // 阻止本次关闭
    }
    return true;        // 放行
});

返回 false 阻止窗口关闭,用于未保存提示、最小化到托盘等。

App 级事件 ​

进程级生命周期 + 自动更新:

cpp
app.on(AppEvent::Quit, []() { /* 退出前清理 */ });
app.onBeforeQuit([]() -> bool {
    return allowQuit();   // false 取消退出
});

// 自动更新事件
app.on(AppEvent::UpdateAvailable, [](const UpdateInfo& info) {
    // info.version / info.url / info.releaseNotes
});
app.on(AppEvent::UpdateDownloadProgress, [](const UpdateProgress& p) {
    // p.percent / p.bytesPerSecond
});
app.on(AppEvent::UpdateDownloaded, [](const UpdateInfo& info) {
    // info.filePath = 本地 exe 路径,可调 quitAndInstall()
});
app.on(AppEvent::UpdateError, [](const std::wstring& err) {
    // 显示错误
});
事件payload说明
Ready—app 就绪
Quit—退出前
ThemeChanged—系统主题变
UpdateChecking—开始检查更新
UpdateAvailableUpdateInfo新版本可用
UpdateNotAvailable—已是最新
UpdateDownloadProgressUpdateProgress下载进度
UpdateDownloadedUpdateInfo下载完成
UpdateErrorwstring出错

线程安全 ​

WARNING

EventBus 仅 UI 线程安全。所有事件回调在 UI 线程派发。跨线程想触发事件,用 App 投递回 UI 线程,勿直接调 EventBus。

下一步 ​