窗口菜单
本地应用程序菜单可附加到窗口。
创建菜单
要创建本地窗口菜单,请导入Menu
、Submenu
、MenuItem
和 CustomMenuItem
类型。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(())
})
}