人人都会AI编程

9.5 窗口状态持久化:位置、尺寸、最大化状态记忆

更新时间:2026-07-11

要让用户每次打开应用时,窗口都出现在熟悉的位置、保持相同的尺寸,甚至记住是否最大化,这种“状态记忆”能显著提升体验。Tauri 官方提供了 tauri-plugin-window-state 插件,几乎零配置就能实现窗口状态的自动保存与恢复。

安装插件

在 Rust 端添加依赖(Cargo.toml):

[dependencies]
tauri-plugin-window-state = "2"

然后在 main.rs 中注册插件:

fn main() {
    tauri::Builder::default()
        .plugin(tauri_plugin_window_state::Builder::default().build())
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

前端无需任何代码,插件会自动监听窗口的移动、缩放、最大化事件,并在应用退出时将状态写入本地文件(通常保存在系统应用数据目录下的 .window-state 文件中)。下次启动时,插件读取该文件并恢复窗口状态。

控制保存行为

如果你希望更精细地控制何时保存(比如用户手动触发),可以禁用自动保存,改为命令式调用:

.plugin(
    tauri_plugin_window_state::Builder::default()
        .with_deny_save_on_blur(true)   // 窗口失去焦点时不自动保存
        .with_deny_save_on_resize(true) // 缩放时不保存
        .with_deny_save_on_move(true)   // 移动时不保存
        .build()
)

然后在前端通过 Rust 命令手动触发保存:

#[tauri::command]
fn save_window_state(app: tauri::AppHandle) {
    tauri_plugin_window_state::AppHandleExt::save_window_state(app).unwrap();
}

前端调用:

import { invoke } from '@tauri-apps/api/core';
await invoke('save_window_state');

仅保存特定窗口

如果应用有多个窗口,插件默认会记住所有窗口。你可以指定仅保存主窗口:

.plugin(
    tauri_plugin_window_state::Builder::default()
        .with_denylist(&["splash"]) // 不保存名为 "splash" 的窗口
        .build()
)

重置为默认状态

插件默认会记住状态。如果用户希望重置窗口到初始大小/位置,可以删除保存的文件,或调用 window.unmaximize() 并恢复到预设尺寸。更简单的做法是提供一个菜单项或按钮,调用:

import { Window } from '@tauri-apps/api/window';
const appWindow = Window.getCurrent();
await appWindow.unmaximize();
await appWindow.setSize(new LogicalSize(800, 600));
await appWindow.center();

注意事项

  • 插件保存的是窗口的逻辑尺寸(不含缩放),跨 DPI 切换也能正确恢复。
  • 如果用户上次关闭时窗口最大化,下次启动会自动最大化;如果上次是正常状态,会恢复到关闭前的位置和尺寸。
  • 保存的文件路径可通过 with_filename("custom-state.json") 自定义。

使用这个插件后,你的 Tauri 应用立刻拥有原生级别的“记住窗口位置”能力,无需手写任何状态序列化或手工监听事件。