窗口菜单

本地应用程序菜单可附加到窗口。

创建菜单

要创建本地窗口菜单,请导入MenuSubmenuMenuItemCustomMenuItem 类型。MenuItem 枚举包含特定于平台的项目集合(目前尚未在 Windows 上实现)。CustomMenuItem允许您创建自己的菜单项并为其添加特殊功能。


use tauri::{CustomMenuItem, Menu, MenuItem, Submenu};

创建Menu实例:


// 这里的 `"quit".to_string()`定义了菜单项 id,第二个参数是菜单项标签。
let quit = CustomMenuItem::new("quit".to_string(), "Quit");
let close = CustomMenuItem::new("close".to_string(), "Close");
let submenu = Submenu::new("File", Menu::new().add_item(quit).add_item(close));
let menu = Menu::new()
  .add_native_item(MenuItem::Copy)
  .add_item(CustomMenuItem::new("hide", "Hide"))
  .add_submenu(submenu);

将菜单添加到所有窗口

可以使用 tauri::Builder 结构上的menu API 将定义的菜单设置到所有窗口:


use tauri::{CustomMenuItem, Menu, MenuItem, Submenu};

fn main() {
  let menu = Menu::new(); // 配置菜单
  tauri::Builder::default()
    .menu(menu)
    .run(tauri::generate_context!())
    .expect("error while running tauri application");
}

将菜单添加到特定窗口

您可以创建一个窗口并设置要使用的菜单。这样就可以为每个应用程序窗口定义特定的菜单集。


use tauri::{CustomMenuItem, Menu, MenuItem, Submenu};
use tauri::WindowBuilder;

fn main() {
  let menu = Menu::new(); // configure the menu
  tauri::Builder::default()
    .setup(|app| {
      WindowBuilder::new(
        app,
        "main-window".to_string(),
        tauri::WindowUrl::App("index.html".into()),
      )
      .menu(menu)
      .build()?;
      Ok(())
    })
    .run(tauri::generate_context!())
    .expect("error while running tauri application");
}

监听自定义菜单项上的事件

每个CustomMenuItem在被点击时都会触发一个事件。使用 on_menu_event API 在全局 tauri::Builder 或特定窗口中处理这些事件。

监听全局菜单上的事件


use tauri::{CustomMenuItem, Menu, MenuItem};

fn main() {
  let menu = Menu::new(); // 配置菜单
  tauri::Builder::default()
    .menu(menu)
    .on_menu_event(|event| {
      match event.menu_item_id() {
        "quit" => {
          std::process::exit(0);
        }
        "close" => {
          event.window().close().unwrap();
        }
        _ => {}
      }
    })
    .run(tauri::generate_context!())
    .expect("error while running tauri application");
}

监听窗口菜单上的事件


use tauri::{CustomMenuItem, Menu, MenuItem};
use tauri::{Manager, WindowBuilder};

fn main() {
  let menu = Menu::new(); // 配置菜单
  tauri::Builder::default()
    .setup(|app| {
      let window = WindowBuilder::new(
        app,
        "main-window".to_string(),
        tauri::WindowUrl::App("index.html".into()),
      )
      .menu(menu)
      .build()?;
      let window_ = window.clone();
      window.on_menu_event(move |event| {
        match event.menu_item_id() {
          "quit" => {
            std::process::exit(0);
          }
          "close" => {
            window_.close().unwrap();
          }
          _ => {}
        }
      });
      Ok(())
    })
    .run(tauri::generate_context!())
    .expect("error while running tauri application");
}

更新菜单项

Window 结构有一个 menu_handle 方法,用于更新菜单项:


fn main() {
  let menu = Menu::new(); // 配置菜单
  tauri::Builder::default()
    .menu(menu)
    .setup(|app| {
      let main_window = app.get_window("main").unwrap();
      let menu_handle = main_window.menu_handle();
      std::thread::spawn(move || {
        // you can also `set_selected`, `set_enabled` and `set_native_image` (macOS only).
        menu_handle.get_item("item_id").set_title("New title");
      });
      Ok(())
    })
}