Jot跨平台实战:如何在Avalonia UI中实现窗口状态持久化

📅 2026/8/21 18:24:49
Jot跨平台实战:如何在Avalonia UI中实现窗口状态持久化
Jot跨平台实战如何在Avalonia UI中实现窗口状态持久化【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/Jot每次启动应用窗口大小和位置总是归零你是不是也受够了这种体验Jot跨平台状态持久化库正是为解决这个问题而生的。Jot 是一个轻量级的 .NET 应用状态持久化库专门负责保存和恢复窗口尺寸、位置、选中标签页等状态数据。本文以 Avalonia UI 跨平台应用为例带你一步步实现窗口状态持久化从此告别繁琐的配置文件样板代码。为什么窗口状态持久化是跨平台开发的痛点无论 WPF、WinForms 还是 Avalonia UI几乎所有桌面应用都需要记住 UI 状态包括窗口/工具栏的大小和位置 上次输入的数据用户名、选中的标签页、最近打开的文件各种设置与用户偏好传统做法是使用 .settings 文件但每新增一个属性就要在设置文件、构造函数、关闭事件里重复写上多遍既繁琐又容易出错。如果窗口有 10 个可移动元素配置文件就会变成一大片命名相近的属性丛林维护成本极高。Jot 是什么一次配置处处追踪Jot 的核心思想很简单你只需要声明要追踪哪些对象的哪些属性以及何时保存、何时恢复。之后 Jot 会自动完成读取和写入代码更简洁、意图更清晰。Jot 的架构由两大核心组成Tracker追踪器负责管理所有被追踪的对象入口在Jot/Tracker.csTrackingConfiguration追踪配置声明属性、持久化触发事件等规则入口在Jot/Configuration/TrackingConfiguration.cs此外Jot 还支持通过特性Attribute声明式配置如[Trackable]、[PersistOn]等详见Jot/Configuration/Attributes/目录。Avalonia UI 窗口状态持久化3 步搞定Avalonia UI 是跨平台 UI 框架可以同时构建 Windows、Linux、macOS 桌面应用。Jot 官方在README.md中专门给出了 Avalonia UI 的完整方案实现过程只有 3 步。第 1 步安装 Jot在 NuGet 包管理器控制台执行install-package JotJot 支持 .NET Standard 2.0可以放心用在 Avalonia UI 项目中。第 2 步在 Program.cs 中创建全局 Trackerpublic static Tracker Tracker new Tracker();这里将 Tracker 暴露为静态字段只是为了演示方便实际项目中也可以通过依赖注入容器管理。第 3 步在窗口构造函数中配置并开启追踪public MainWindow() { InitializeComponent(); #if DEBUG this.AttachDevTools(); #endif var initialPosition this.Position; var trackerNamespace string.Join(_, Screens.All.Select(s s.WorkingArea.Size.ToString())); Program.Tracker.ConfigureWindow() .Id(w w.Name, trackerNamespace) .Properties(w new { w.WindowState, w.Position, w.Width, w.Height }) .PersistOn(nameof(Window.Closing)) .StopTrackingOn(nameof(Window.Closing)); Program.Tracker.Track(this); // ...边界处理见下文 }这段代码的意图非常清晰Id用窗口名称 屏幕工作区尺寸生成唯一标识多显示器环境也能独立记忆Properties声明要追踪的属性——窗口状态、位置、宽度、高度PersistOn窗口关闭时自动保存StopTrackingOn窗口关闭后停止追踪避免保存到无意义的数据Track应用已保存的状态并开始监听只需一行代码跨平台场景的 3 个边界处理技巧Avalonia UI 与 WPF 略有不同官方在 README 中提醒了三个容易踩坑的地方最小化恢复如果在最小化状态下关闭应用下次启动窗口可能还是最小化的需要在加载时强制恢复正常状态。负坐标陷阱应用最小化时Position会返回负值直接设置会把窗口移到屏幕外必须判断并回退到初始位置。屏幕信息来源不同Avalonia 的屏幕信息从Window类获取WPF 则是静态的SystemInformation。对应处理代码if (this.WindowState WindowState.Minimized) { this.WindowState WindowState.Normal; } if (this.Position.X -1 || this.Position.Y -1) // -1 是 Win11 贴靠窗口的边界值 { this.Position initialPosition; }状态数据存到哪里JSON 文件存储详解Jot 默认使用JsonFileStore位于Jot/Storage/JsonFileStore.cs把数据保存为 JSON 文件存放路径为%AppData%\[公司名]\[应用名]每个被追踪对象对应一个独立的 JSON 文件读写速度更快。你也可以自定义存储位置// 指定自定义目录 var tracker new Tracker(new JsonFileStore(c:\example\path\)); // 或使用每台机器共享的目录 var tracker new Tracker(new JsonFileStore(Environment.SpecialFolder.CommonApplicationData));甚至可以实现IStore接口把状态存到数据库或云端实现多台设备之间的设置同步——接口定义非常简单只有SetData和GetData两个方法。总结用 Jot 实现 Avalonia UI窗口状态持久化核心优势一目了然✅ 每个属性只需声明一次告别重复样板代码✅ 自动处理保存时机与恢复时机无需手动干预✅ 内置 JSON 存储支持自定义存储与云端同步✅ 跨平台通用一套代码适用 WPF、WinForms、Avalonia UI如果你正在开发 Avalonia UI 跨平台应用不妨现在就试试 Jot用三行配置换来清爽的窗口状态持久化体验【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/Jot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考