如何在Tauri中通过窗口菜单创建新窗口?遇create_window方法不可用
解决Tauri菜单事件中无法调用create_window创建新窗口的问题
你遇到的问题是因为event.window().clone()获取的是已存在的窗口实例,这个对象并没有提供创建新窗口的方法。要创建新窗口,你需要通过Tauri的AppHandle(应用句柄)来操作,结合WindowBuilder实现和主窗口相同配置的新窗口。
修复步骤:
- 获取应用句柄:从菜单事件的窗口对象中获取
AppHandle,它是创建新窗口的核心入口。 - 复用主窗口配置:读取主窗口的URL、标题等配置,用
WindowBuilder复刻一个相同的窗口。 - 构建并显示新窗口:调用
WindowBuilder的build方法完成窗口创建。
修改后的完整代码:
#![cfg_attr( all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows" )] use tauri::{Menu, WindowMenuEvent, Wry, Submenu, CustomMenuItem, WindowUrl, WindowBuilder}; pub fn create() -> Menu { let test_menu = Menu::new() .add_item(CustomMenuItem::new("new_window", "Create new window")); Menu::new() .add_submenu(Submenu::new("Test", test_menu)) } pub fn handler(event: WindowMenuEvent<Wry>) { match event.menu_item_id() { "new_window" => { // 获取主窗口实例 let main_window = event.window(); // 获取应用句柄 let app_handle = main_window.app_handle(); // 复刻主窗口的URL let window_url = main_window.url().clone(); // 构建并创建新窗口,复用主窗口的标题和URL WindowBuilder::new(&app_handle, "new_window_instance".to_string(), window_url) .title(main_window.title()) .build() .expect("Failed to create new window"); } _ => {} } } fn main() { tauri::Builder::default() .menu(create()) .on_menu_event(handler) .run(tauri::generate_context!()) .expect("error while running tauri application"); }
关键说明:
main_window.app_handle():获取应用全局句柄,所有窗口的创建都依赖它。WindowBuilder::new:第一个参数是AppHandle,第二个是窗口的唯一标识符(需保证不重复,可自定义),第三个是窗口加载的URL,这里直接复用主窗口的URL实现相同窗口效果。- 如果需要完全复刻主窗口的大小、位置等配置,可以额外调用
.size()、.position()等方法,从主窗口的inner_size()、outer_position()获取对应值。
内容的提问来源于stack exchange,提问作者Snoz3f
相关产品推荐
相关产品推荐

