多窗口

在一个应用程序上管理多个窗口

创建窗口

窗口可以通过 Tauri 配置文件静态创建,也可以在运行时创建。

静态窗口

可使用 tauri.windows 配置数组创建多个窗口。下面的 JSON 代码段演示了如何通过配置静态创建多个窗口:


{
  "tauri": {
    "windows": [
      {
        "label": "external",
        "title": "Tauri Docs",
        "url": "https://tauri.app"
      },
      {
        "label": "local",
        "title": "Tauri",
        "url": "index.html"
      }
    ]
  }
}

请注意,窗口标签必须是唯一的,并可在运行时用于访问窗口实例。静态窗口可用配置选项的完整列表可在 WindowConfig 文档中找到。

运行时窗口

您还可以通过 Rust 层或 Tauri API 在运行时创建窗口。

用 Rust 创建窗口

可以使用 WindowBuilder 结构在运行时创建窗口。

要创建窗口,必须有一个正在运行的App实例或 AppHandle

使用 App 实例创建窗口

可以通过设置钩子或调用 Builder::build 获取App实例。


tauri::Builder::default()
  .setup(|app| {
    let docs_window = tauri::WindowBuilder::new(
      app,
      "external", /* 唯一的窗口标签 */
      tauri::WindowUrl::External("https://tauri.app/".parse().unwrap())
    ).build()?;
    let local_window = tauri::WindowBuilder::new(
      app,
      "local",
      tauri::WindowUrl::App("index.html".into())
    ).build()?;
    Ok(())
  })
  .run(tauri::generate_context!())
  .expect("error while running app");

使用设置钩子可确保初始化静态窗口和 Tauri 插件。或者,也可以在构建App后创建窗口:


let app = tauri::Builder::default()
  .build(tauri::generate_context!())
  .expect("error while building tauri application");

let docs_window = tauri::WindowBuilder::new(
  &app,
  "external", /* 唯一的窗口标签 */
  tauri::WindowUrl::External("https://tauri.app/".parse().unwrap())
).build().expect("failed to build window");

let local_window = tauri::WindowBuilder::new(
  &app,
  "local",
  tauri::WindowUrl::App("index.html".into())
).build()?;

// 这将启动app,在此代码之下的其他代码将不会运行。
app.run(|_, _| {});

当无法将值的所有权转移到设置闭包时,这种方法非常有用。

使用 AppHandle 实例创建窗口

AppHandle 实例可以使用 [App::handle] 函数获取,也可以直接注入到 Tauri 命令中。


tauri::Builder::default()
  .setup(|app| {
    let handle = app.handle();
    std::thread::spawn(move || {
      let local_window = tauri::WindowBuilder::new(
        &handle,
        "local",
        tauri::WindowUrl::App("index.html".into())
      ).build()?;
    });
    Ok(())
  })


#[tauri::command]
async fn open_docs(handle: tauri::AppHandle) {
  let docs_window = tauri::WindowBuilder::new(
    &handle,
    "external", /* 唯一的窗口标签 */
    tauri::WindowUrl::External("https://www.tauri.net.cn/".parse().unwrap())
  ).build().unwrap();
}

信息

在 Tauri 命令中创建窗口时,确保命令函数是async(异步函数),以避免因 wry#583 问题导致 Windows 死锁。

用 JavaScript 创建窗口

使用Tauri API,您可以通过导入 WebviewWindow类在运行时轻松创建一个窗口。


import { WebviewWindow } from '@tauri-apps/api/window'
const webview = new WebviewWindow('theUniqueLabel', {
  url: 'path/to/page.html',
})
// 因为webview窗口是异步创建的、
// Tauri 发出 `tauri://created` 和 `tauri://error` 以通知您创建响应
webview.once('tauri://created', function () {
  // 成功创建 webview 窗口
})
webview.once('tauri://error', function (e) {
  // 创建 Webview 窗口时发生错误
})

创建其他 HTML 页面

如果要创建 index.html 以外的其他页面,则需要在构建时确保它们出现在 dist 目录中。具体方法取决于您的前台设置。如果使用 Vite,请在 vite.config.js 中为第二个 HTML 页面创建一个附加输入

运行时访问窗口

窗口实例可使用其标签和 Rust 的 get_window 方法或 JavaScript 的 WebviewWindow.getByLabel 方法进行查询。


use tauri::Manager;
tauri::Builder::default()
  .setup(|app| {
    let main_window = app.get_window("main").unwrap();
    Ok(())
  })

请注意,必须导入 tauri::Manager 才能在 AppAppHandle 实例上使用 get_window 方法。


import { WebviewWindow } from '@tauri-apps/api/window'
const mainWindow = WebviewWindow.getByLabel('main')

与其他窗口通信

窗口通信可通过事件系统完成。更多信息,请参阅事件指南