You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中My.Settings无法保存窗体位置问题求助

窗体位置无法通过My.Settings记忆的原因及修复方案

核心问题分析

  1. 未持久化设置修改
    你仅在LocationChanged事件中修改了My.Settings的变量,但没有调用My.Settings.Save()方法。默认情况下,My.Settings的修改仅停留在内存中,程序重启后会恢复为初始值,无法真正保存到配置文件。

  2. 事件触发时机不合理
    LocationChanged事件会在窗体移动过程中频繁触发(包括窗体加载时的初始位置调整),不仅会造成不必要的IO操作,还可能在首次启动时覆盖初始设置。

  3. 初始位置判断逻辑缺陷
    你的判断条件Not (X=0 And Y=0)会导致:如果用户主动将窗体拖到屏幕(0,0)位置,下次启动时无法加载该位置的设置。

  4. 语法细节问题
    代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:15:39