尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Jot状态恢复:如何优雅处理最小化与最大化窗口

Jot状态恢复:如何优雅处理最小化与最大化窗口 Jot状态恢复如何优雅处理最小化与最大化窗口【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/Jot在 .NET 桌面应用开发中Jot 状态恢复功能堪称最省心的解决方案。Jot 是一款轻量级的 .NET 应用状态持久化库只需几行代码就能自动保存并恢复窗口的大小、位置和显示状态。不过最小化和最大化窗口一直是窗口状态恢复的重灾区窗口最小化时坐标和尺寸数据会失真如果原样保存下次启动应用时窗口可能出现在屏幕外或以错误的大小弹出。本文就带大家用 Jot 优雅地处理最小化与最大化窗口让 .NET 窗口状态恢复既简单又可靠。为什么最小化与最大化窗口的状态恢复这么麻烦窗口在普通状态Normal下Left、Top、Width、Height这些属性是可靠的。但当窗口进入最小化或最大化状态时Windows 会返回失真甚至无意义的尺寸和位置数据最小化时窗口位置可能被系统重置为 (-32000, -32000) 之类的坐标尺寸也变得诡异最大化时窗口尺寸和位置会覆盖整个屏幕若直接保存下次启动可能丢失用户精心调整的窗口大小关闭时最小化如果用户在最小化状态下关闭了应用下次启动窗口仍是最小化状态用户一脸懵。如果我们把这类脏数据原样写入配置Jot 状态恢复就成了灾难现场。好在 Jot 提供了非常优雅的拦截机制让我们能精准过滤掉这些无效数据。Jot 窗口状态恢复的核心用法一次配置处处跟踪Jot 的使用哲学很清晰先告诉它怎么跟踪配置再告诉它跟踪谁Track。配置部分集中在启动代码里业务代码几乎零侵入。以 WinForms 为例核心配置写在Demo/TestWinForms/Services.cs中Tracker .ConfigureForm() .Id(f f.Name, SystemInformation.VirtualScreen.Size) .Properties(f new { f.Top, f.Width, f.Height, f.Left, f.WindowState }) .PersistOn(nameof(Form.Move), nameof(Form.Resize), nameof(Form.FormClosing)) .StopTrackingOn(nameof(Form.FormClosing));Properties声明需要跟踪的窗口属性位置、大小、窗口状态PersistOn指定在哪些事件发生时保存数据StopTrackingOn窗口关闭后停止跟踪避免保存已失效的数据。之后在每个窗体里只需一行tracker.Track(this)即可完成 Jot 状态恢复。最小化与最大化窗口巧用 WhenPersistingProperty 过滤脏数据这是本文的重中之重针对最小化和最大化窗口WinForms 官方示例给出了教科书级的处理方案——用WhenPersistingProperty钩子在保存前拦截数据Tracker .ConfigureForm() .Id(f f.Name, SystemInformation.VirtualScreen.Size) .Properties(f new { f.Top, f.Width, f.Height, f.Left, f.WindowState }) .PersistOn(nameof(Form.Move), nameof(Form.Resize), nameof(Form.FormClosing)) .WhenPersistingProperty((f, p) p.Cancel (f.WindowState ! FormWindowState.Normal (p.Property nameof(Form.Height) || p.Property nameof(Form.Width) || p.Property nameof(Form.Top) || p.Property nameof(Form.Left)))) .StopTrackingOn(nameof(Form.FormClosing));这段代码的精妙之处在于当窗体处于最小化或最大化状态时自动取消保存尺寸和位置属性但WindowState本身仍然正常保存这样用户下次启动时窗口状态比如最大化依然能恢复窗口回到 Normal 状态后正常保存位置和尺寸用户体验丝滑。原理上WhenPersistingProperty回调收到的PropertyOperationData见Jot/Configuration/TrackingOperationEventArgs.cs提供了Cancel和Value两个关键成员前者用于取消本次保存后者支持值转换——这套机制同样适用于应用数据时的拦截。WPF 窗口状态恢复配置指南WPF 的处理比 WinForms 简单一些因为 WPF 窗口在最小化/最大化时位置数据相对可靠。官方推荐这样配置参考Demo/TestWPF/Services.csTracker .ConfigureWindow() .Id(w w.Name, SystemInformation.VirtualScreen.Size) .Properties(w new { w.Top, w.Width, w.Height, w.Left, w.WindowState }) .PersistOn(nameof(Window.Closing)) .StopTrackingOn(nameof(Window.Closing));在窗口构造函数中调用Tracker.Track(this)Jot 就会自动完成启动时恢复 关闭时保存的完整闭环。WPF 唯一需要注意的是若用户在最小化状态下关闭窗口WindowState会被保存为Minimized下次启动窗口依然是缩小的。如有需要可在窗口加载后判断并重置状态。多显示器场景下的窗口位置恢复技巧当用户有多块屏幕时窗口恢复还面临一个经典问题拔掉外接显示器后窗口可能被恢复到不存在的屏幕上。Jot 的解决办法很聪明——把屏幕分辨率作为标识符的一部分.Id(f f.Name, SystemInformation.VirtualScreen.Size)这样 Jot 会为不同的屏幕配置分别维护窗口状态外接屏接上时恢复外接屏的位置拔掉后则使用单屏的配置窗口永远不会消失在屏幕外。这一技巧在 WinForms 和 WPF 中通用。总结最小化与最大化窗口状态恢复的最佳实践回顾一下用 Jot 处理最小化与最大化窗口只需记住三个要点配置一次处处跟踪把窗口跟踪配置集中在启动类业务代码只用一行Track(this)保存前拦截脏数据WinForms 用WhenPersistingPropertyCancel过滤最小化/最大化时的位置尺寸数据用屏幕分辨率做标识符多显示器环境下避免窗口恢复到不存在的屏幕。Jot 的核心逻辑集中在Jot/Tracker.cs和Jot/Configuration/TrackingConfigurationGeneric.cs配套的完整示例可以直接参考仓库中的Demo/TestWinForms和Demo/TestWPF两个演示项目。搞定这三步你的 .NET 应用就能像专业软件一样记住用户最后一次的窗口状态优雅地应对最小化与最大化。【免费下载链接】JotJot is a library for persisting and applying .NET application state.项目地址: https://gitcode.com/gh_mirrors/jot1/Jot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表