Avalonia 本身 没有内置名为 PersistedState
的类或模块。你看到的 `PersistedState` 类(如 `com.microsoft.bot.dialogs.PersistedState`)属于 Microsoft Bot Framework,与 Avalonia 无关——这是常见混淆点。
为什么 Avalonia 不提供 PersistedState?
Avalonia 是 UI 框架,专注跨平台渲染和交互,不负责状态持久化逻辑。它把数据存储交由开发者自主选择:文件、SQLite、JSON 配置、系统设置或第三方库。所谓 “Avalonia 中的 PersistedState”,实际是开发者自行实现的状态序列化 + 存储方案。
在 Avalonia 中实现状态持久化的常用方式
以下方法均已在 Avalonia 11+ 生产项目中验证有效:
使用IStorageProvider保存/读取 JSON 配置 利用 Avalonia 内置的跨平台文件访问接口,安全写入用户偏好、窗口尺寸、主题等轻量状态:
var storage = TopLevel.GetTopLevel(this)!.StorageProvider;
var file = await storage.TryGetFileFromPathAsync(new Uri("user-settings.json"));
if (file != null) {
await using var stream = await file.OpenReadAsync();
var json = await new StreamReader(stream).ReadToEndAsync();
settings = JsonSerializer.Deserialize<AppSettings>(json);
}
结合 SQLite 或 LiteDB 做结构化持久化
适合需要查询、版本控制或离线同步的场景(如笔记应用、本地数据库管理器):
添加 LiteDBNuGet 包 在 App 初始化时打开数据库:
new LiteDatabase("data.db")
将 ViewModel 状态对象直接映射为集合(如 db.GetCollection<windowstate>("windows")</windowstate>)
利用平台原生机制(推荐用于系统级设置)
Windows:通过 Windows.Storage.ApplicationData.Current.LocalSettings(需启用 WinUI 兼容层) macOS/Linux:使用
~/.config/your-app/config.json路径,配合
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
避免踩坑的关键细节
实际开发中容易忽略但影响体验的几点:
异步写入要防抖:不要每次属性变更都立刻存盘,建议加 300ms 延迟或使用Task.Run(() => SaveAsync())脱离 UI 线程 路径权限需显式处理:Linux/macOS 下
~/.config可能不存在,首次使用前应
Directory.CreateDirectory()敏感数据勿明文存 localStorage 类位置:密码、token 等应交由系统密钥环(如
libsecret/
Keychain/
Windows Credential Manager) 版本迁移要预留字段:JSON 结构升级时,用
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]和默认值兼容旧数据
不复杂但容易忽略——Avalonia 的状态持久化,核心是选对存储媒介 + 控制好序列化时机 + 尊重各平台约定。没有银弹,但有清晰路径。
