ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Jot进阶:如何用事件触发状态自动保存(PersistOn与StopTrackingOn)

Jot进阶:如何用事件触发状态自动保存(PersistOn与StopTrackingOn) Jot进阶如何用事件触发状态自动保存PersistOn与StopTrackingOn【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/JotJot 是一个面向 .NET 的应用状态持久化库它能把窗口位置、表单内容、用户设置等对象属性自动保存并恢复。在上一篇文章中我们掌握了 Jot 的基础用法而今天要讲的是它的进阶核心用事件触发状态自动保存——通过PersistOn和StopTrackingOn让 Jot 在指定事件发生时自动完成保存或停止跟踪彻底告别手动调用Persist()的繁琐代码。为什么要用事件触发自动保存在普通场景下保存状态需要你在合适的时机手动调用tracker.Persist(obj)。但合适时机往往很难把握窗口移动了要保存、关闭时要保存、用户点按钮时要保存……手写一堆事件订阅代码既啰嗦又容易漏。Jot 的PersistOn和StopTrackingOn正是为此而生声明式地告诉 Jot 当哪个事件发生时做什么其余交给库去处理。相关实现位于 TrackingConfiguration.cs 与 Trigger.cs。一、PersistOn 事件触发自动保存的三种用法PersistOn负责把某个事件注册为保存触发器事件一触发对象属性就自动写入存储。核心 API 定义在 TrackingConfiguration.cs 中支持三种写法。用法 1监听目标对象自身的事件最常见的方式直接把目标对象的某个事件作为保存信号。比如保存窗口的位置和大小var tracker new Tracker(); tracker.ConfigureMainWindow() .Property(w w.Left) .Property(w w.Top) .Property(w w.Width) .Property(w w.Height) .PersistOn(nameof(Window.LocationChanged), nameof(Window.SizeChanged)); tracker.Track(window);这段配置完成后窗口每被拖动或缩放一次Jot 就会自动把新位置写入存储无需任何手动代码。PersistOn支持一次传多个事件名非常灵活。用法 2监听其他对象的事件当保存信号来自别的对象时可以传入事件源对象或一个获取事件源的委托。比如用户点击保存按钮时才写入tracker.ConfigureDocument() .Properties(d new { d.Text, d.FontSize }) .PersistOn(nameof(Button.Click), saveButton); // saveButton 点击时自动保存甚至可以传入委托Funcobject, object在运行时动态决定事件源适用于更复杂的解耦场景。用法 3特性声明零配置代码Jot 还提供了[PersistOn]特性直接打在事件上配合[Trackable]、[TrackingId]使用配置代码可以全部省略特性定义见 PersistTriggerAttributete.cspublic class SearchForm { [TrackingId] public int FormId { get; set; } [Trackable] public string SearchText { get; set; } [PersistOn] public event EventHandler SearchExecuted; // 搜索执行时自动保存 }二、StopTrackingOn关键时刻叫停自动保存StopTrackingOn的作用恰恰相反当指定事件触发时停止对目标对象的跟踪。这非常有用——比如窗口已经关闭或表单已销毁此时再去保存它的状态很可能把无效数据写入存储下次启动时恢复出奇怪的结果。tracker.ConfigureLoginDialog() .Properties(d new { d.UserName }) .PersistOn(nameof(LoginDialog.LoginClicked)) .StopTrackingOn(nameof(LoginDialog.Closed)); // 关闭后停止跟踪停止跟踪后PersistOn注册的所有事件订阅都会被自动解除内部通过 StopTracking 方法 统一退订后续即使事件再次触发也不会保存。同样的你也可以用[StopTrackingOn]特性声明详见 StopTrackingTrigger.cs。三、两种机制速查对比对比项PersistOnStopTrackingOn触发后行为立即保存目标属性解除跟踪、退订所有事件典型事件LocationChanged、Click、TextChangedClosed、Disposed、Closed 后清理是否可叠加可注册多个触发器全局仅一个特性形式[PersistOn][StopTrackingOn]是否支持外部事件源支持支持四、完整实战窗口状态自动保存结合 Demo 项目见 MainWindow.xaml.cs的思路一个完整的窗口自动保存示例public MainWindow() { InitializeComponent(); // 配置跟踪位置、尺寸和当前标签页关闭时自动保存 Services.Tracker.ConfigureMainWindow() .Property(w w.Left) .Property(w w.Top) .Property(w w.Width) .Property(w w.Height) .Property(w w.tabControl.SelectedIndex, SelectedTab) .PersistOn(nameof(Window.LocationChanged), nameof(Window.SizeChanged)) .StopTrackingOn(nameof(Window.Closed)); // 开始跟踪先恢复上次保存的值再监听事件 Services.Tracker.Track(this); }启动时Track()会自动把存储中保存的旧状态应用到窗口运行期间的每次移动、缩放、切换标签都会实时落盘关闭窗口后停止跟踪——整个生命周期全程自动化。五、进阶最佳实践PersistOn 与 StopTrackingOn 成对使用通常PersistOn负责活着时保存StopTrackingOn负责销毁后叫停避免无效数据写入。注意事件名拼写事件名必须与对象上的真实事件完全一致否则 Jot 会抛出ArgumentException提醒你检查配置。配合 PersistAll 兜底对于不方便找事件的对象仍可在退出时调用tracker.PersistAll()做一次全局保存见 Tracker.cs。善用测试验证行为Jot 的测试集 TrackerTests.cs 中有大量PersistOn、StopTrackingOn的用例是你学习 API 行为的最佳参考。总结事件触发状态自动保存是 Jot 最实用的进阶能力。PersistOn让你把保存时机声明出来StopTrackingOn让你把跟踪生命周期管理起来两者配合即可实现窗口、表单、文档等各类对象的全自动状态持久化。少写几百行事件代码多留时间打磨真正的业务逻辑这就是 Jot 的魅力所在。【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/Jot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表