VB.NET中My.Settings无法保存窗体位置问题求助
窗体位置无法通过My.Settings记忆的原因及修复方案
核心问题分析
未持久化设置修改
你仅在LocationChanged事件中修改了My.Settings的变量,但没有调用My.Settings.Save()方法。默认情况下,My.Settings的修改仅停留在内存中,程序重启后会恢复为初始值,无法真正保存到配置文件。事件触发时机不合理
LocationChanged事件会在窗体移动过程中频繁触发(包括窗体加载时的初始位置调整),不仅会造成不必要的IO操作,还可能在首次启动时覆盖初始设置。初始位置判断逻辑缺陷
你的判断条件Not (X=0 And Y=0)会导致:如果用户主动将窗体拖到屏幕(0,0)位置,下次启动时无法加载该位置的设置。语法细节问题
代码中sender.Location.y的小写y应为大写Y;VB.NET规范写法中IF/END IF应改为If/End If,END SUB改为End Sub(虽然VB不区分大小写,但规范写法可避免潜在问题)。
修复后的代码实现
1. 调整项目设置默认值
在项目设置界面,将Window_Location_Setting_X和Window_Location_Setting_Y的默认值改为-1(用于区分首次运行和用户主动设置的位置)。
2. 窗体加载事件(GUI_Load)
Private Sub GUI_Load(sender As Object, e As EventArgs) Handles MyBase.Load If My.Settings.Window_Location_Setting_X <> -1 And My.Settings.Window_Location_Setting_Y <> -1 Then Me.StartPosition = FormStartPosition.Manual Me.Location = New Point(My.Settings.Window_Location_Setting_X, My.Settings.Window_Location_Setting_Y) Else ' 首次运行时默认居中屏幕,并保存初始位置 Me.StartPosition = FormStartPosition.CenterScreen My.Settings.Window_Location_Setting_X = Me.Location.X My.Settings.Window_Location_Setting_Y = Me.Location.Y My.Settings.Save() End If End Sub
3. 窗体关闭事件(替代LocationChanged)
放弃在LocationChanged中频繁保存,改为在窗体关闭时一次性保存最终位置,更高效且可靠:
Private Sub GUI_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing My.Settings.Window_Location_Setting_X = Me.Location.X My.Settings.Window_Location_Setting_Y = Me.Location.Y My.Settings.Save() ' 关键步骤:将设置写入配置文件 End Sub
内容的提问来源于stack exchange,提问作者Doug Null
相关产品推荐
相关产品推荐

